7月7日、Denoの開発者マーヴィン・H氏が「JavaScriptエコシステムを加速する(Speeding up the JavaScript ecosystem)」と題した記事を公開した。この記事では、TypeScriptの新機能「isolatedDeclaration」が、JavaScript / TypeScriptエコシステムを変革する可能性について詳細に紹介されている。本記事ではその内容を簡単に紹介する。
本記事は、以下のエキスパートの皆様に監修していただきました:
古川陽介さん(Japan Node.js Association代表理事)
うひょさん(株式会社カオナビ フロントエンドエンジニア)
npmパッケージングの問題点
現在npmでのパッケージングプロセスは相当に複雑である。モジュールをnpmに公開しようとする開発者は、CommonJS対ESMの問題や、多くの設定調整を行う必要が生じる。これが原因で、開発者は開発プロセスにnpmを組み込むことを諦め、プロジェクト間で単純にファイルをコピーアンドペーストする方法を選んでしまうことも珍しくない。
問題の一つは、現在のJavaScriptエコシステムでは、コンパイル済みのJavaScriptソースコードと、その型定義ファイルである d.ts
ファイルを個別に生成してパッケージングする必要があることだ。そして、 d.ts
を生成するには、TypeScriptコンパイラの持つ型推論アルゴリズムをフルに稼働させる必要があり、非常に多くのコンピューティングリソースを要する。
TypeScriptの新機能「isolatedDeclaration」
TypeScript 5.5で新たに導入されたisolatedDeclaration
機能の目的は、 型定義ファイル(.d.ts
ファイル)の生成を高速化することである。
isolatedDeclaration
を使用すると、エクスポートされる関数やメソッドに対して、戻り値の型を明示的に指定する必要がある。これは、TypeScriptコンパイラが型推論に時間を費やすことなく、迅速に型定義ファイルを生成できるようにするためだ。
例えば、次のように通常の関数を書く代わりに、戻り値の型を明示的に宣言する必要がある:
// 通常の型推論を使用する場合
export function add(x: number, y: number) {
return x + y;
}
// isolatedDeclarationを使用する場合
export function add(x: number, y: number): number {
return x + y;
}
こうしたルールを守ってコーディングを行うことで、 d.ts
の生成プロセスから型推論を不要とし、単なるコード除去プロセスへと落とし込むことで、大幅な高速化を実現するが、開発者には型に関するより詳細な知識と注意が求められることになる。
ただこうした制約を受け入れることで、パッケージの公開プロセスが単純化され、開発の迅速化が促進されるというメリットがある。
新たなパッケージング時代の幕開け
isolatedDeclarationによる利点は、 d.ts
の生成を高速化することである。
Denoでは更にこれを突き詰め、d.ts
の生成が一瞬で完了するようになることから、 d.ts
の生成を開発者が事前に行う必要性も排除した。
パッケージをインストールする際に、その場で必要に応じて型定義ファイル(.d.ts
ファイル)を自動的に生成することができるようにしたため、パッケージの公開者は、事前に型定義ファイルを生成してパッケージに含める必要がなくなった。
つまりDenoでは、TypeScriptのソースコードをそのままアップロードし、.d.ts
ファイルをインストール時に生成することができる。
具体的なプロセスは次のとおりである。
パッケージの公開:
開発者はTypeScriptのソースコード(.ts
ファイル)をそのままパッケージとして公開できる。従来の方法では、開発者はソースコードからコンパイルして.js
ファイルと.d.ts
ファイルを生成し、これらをパッケージに含めて公開する必要があった。パッケージのインストール:
ユーザがnpmやその他のパッケージマネージャを通じてパッケージをインストールする。オンザフライでの型定義生成:
インストールプロセス中に、isolatedDeclaration
機能をサポートするTypeScriptコンパイラ(またはそれに相当するツール)が動作し、必要な.d.ts
ファイルがリアルタイムで生成される。これは通常、パッケージをインストールする際のビルドステップの一部として組み込まれる。
こうした新たなプロセスにより、 .d.ts
ファイルの生成にかかる時間が大幅に短縮されるだけでなく、パッケージ公開時に管理するファイルを減らすことにも繋がる。特に大規模なプロジェクトや多くの依存関係を持つプロジェクトにおいて、開発とメンテナンスの効率を大きく向上させる可能性があると言えるだろう。
Deno / JSRにおいてすでに利用可能
これまで述べてきたシステムは、2023年12月からDenoで利用可能になっている。
更にこのシステムはDenoだけでなくnpm、yarn、pnpm、さらにはbunでも使用できる。JSRレジストリは、npmプロトコルを実装しているため、これらのパッケージマネージャーとの通信時には、単なる別のnpmレジストリとして機能する。
(Deno以外の)npmクライアントには、オンザフライでd.ts
ファイルを生成するシステムがないため、公開プロセスの裏側でnpm tarball用にそれらを生成する。したがって、npm tarballには、標準的なトランスパイルされた.jsファイルも付属する。npmエコシステム全体は.jsファイルの配布に基づいているため、それを変更すると壊れてしまう。
しかし、TypeScriptを配布できるレジストリと、TypeScriptをネイティブで実行できるランタイムを合わせて使用する場合、isolated declarationsはゲームチェンジャーだと言えるのではないだろうか。
詳細はSpeeding up the JavaScript ecosystemを参照していただきたい。
I absolutely love the character customization options in Sprunked ! It adds a personal touch to the game, allowing me to express my style. The gameplay mechanics are smooth, making it easy to pick up but hard to master. I can spend hours just experimenting with different builds!