CloudflareがWorkersモジュールレジストリを書き換え、Node.js互換性を強化
Cloudflareは、Workersランタイムworkerdのモジュールレジストリを再構築し、より高速で標準準拠性が高く、Node.jsに近い動作を実現しました。新しい実装はモジュール指定子をURLとして扱い、import.meta APIをサポートし、遅延コンパイルとキャッシュ共有を可能にします。

Cloudflareは、Workersランタイムのオープンソースコアであるworkerdのモジュールレジストリを書き換え、より高速で標準準拠性が高く、Node.jsに近い動作を実現しました。new_module_registry互換性フラグで利用できる新しい実装は、モジュールの解決方法、読み込み方法、キャッシュ方法を変更します。
なぜ新しいレジストリなのか?
旧レジストリはモジュール指定子をURLではなくファイルシステム風のパスとして解決していました。そのためimport.meta.urlの実装が難しく、相対インポートはnew URL()と同じルールに従いませんでした。node:やcloudflare:などのプロトコルは、実際のプロトコルではなく特別扱いの文字列プレフィックスとして処理されていました。
旧レジストリはまた、インポートされないモジュールがあってもWorkerバンドル全体を事前にコンパイルし、V8アイソレートごとにすべてのプライベートコピーを保持していました。Cloudflareは負荷分散のために同じWorkerの複数のV8アイソレートを実行するため、同じソースを複数回コンパイルし、メモリ内に複数のコピーを保持することを意味していました。
新しいレジストリは、指定子形式としてURLから始まり、遅延性とキャッシュ共有を初日から設計目標として扱います。既存のレジストリは廃止されるわけではありません。デプロイ済みのWorkersはこれまで通り動作し続けます。
新しいフラグで何が変わるか
new_module_registryを有効にすると、いくつかの改善がもたらされます:
import.meta.url、import.meta.main、import.meta.resolve()がすべて動作します。- モジュール指定子は、クエリ文字列やフラグメントを含めて、実際のURLとして解析・解決されます。
node:組み込みモジュールは、どのようにアクセスしても同じモジュールインスタンスに解決されます。- インポート属性(
with { type: 'json' })が正しく検証されます。 - ESモジュールに対する
require()はNode.jsのrequire(esm)ルールに従います。 - エラーは、どの読み込みパスがトリガーしたかに関係なく、一貫したクラスとメッセージを使用します。
- モジュールは最初にインポートされたときに遅延コンパイルされます。
- WebAssemblyモジュールはソースフェーズインポートをサポートします。
import.metaの動作
新しいレジストリでは、import.meta.urlはモジュールのURLを提供し、import.meta.mainはエントリポイントモジュールでのみtrueになります。import.meta.resolve()は、インポートせずに現在のモジュールに対して指定子を解決します。これは純粋な文字列変換であり、Node.jsやブラウザと同じです。
1つの詳細:import.meta.resolve()はnew URL()のようにパーセントエンコーディングを正規化するため、./a/../b.jsのようなパスを折りたたみますが、すでにパーセントエンコードされた文字はデコードしません。
バンドラーにとっての意味
新しいレジストリは、Rolldown(Vite 8で使用)のようなバンドラーがより少ない変換を行い、モジュール解決をランタイムに依存できる道を開きます。WorkerでNode.js APIをインポートするとき、あなたはコードにバンドルされたポリフィルではなく、workerdに組み込まれたモジュールをインポートしています。Wasm、テキスト、バイナリモジュールは別々のファイルとして提供され、インライン化されるのではなく指定子で参照されます。
--no-bundleでデプロイするか、複数のモジュールを直接アップロードする場合、完全なモジュールグラフは書かれたとおりにランタイムで表示されます。すべての場合において、モジュールレジストリの仕事は、指定子を受け取り、それが指すコードを特定し、コンパイルし、リンクして実行できるモジュールオブジェクトをV8に渡すことです。
新しいレジストリは、指定子形式としてURLから始まり、遅延性とキャッシュ共有を初日から設計目標として扱います。
ディスカッション
0 件のコメント
最初のコメントを投稿しましょう。