8月22日、Node.jsは新しいLTSリリースであるv20.17.0を発表した。
本リリースで最も重要な変更は、同期ESMグラフにおけるrequire()サポート だ。新しいフラグ--experimental-require-module
が追加され、同期ESMグラフに対してrequire()サポートが可能になった。
このフラグが有効化され、ロードされるECMAScriptモジュールが以下の条件を満たしている場合、require()によってそのモジュールがESモジュールとしてロードされ、モジュール名空間オブジェクトが返される。
- 最も近いpackage.jsonに"module"フィールドがある
- .mjs拡張子を持つモジュールであり、完全に同期的(トップレベルのawaitが含まれていない)である
この機能は、動的import()に似ているが、同期的に実行され、直接モジュール名空間オブジェクトが返される点で異なる。
同期ESMグラフとは?
同期ESMグラフとは、JavaScriptのESモジュール(ECMAScriptモジュール)において、モジュールの依存関係が全て同期的に解決できる場合を指す。
通常、ESモジュールの読み込みは非同期で行われるが、「同期ESMグラフ」というのは、モジュールの依存関係が全て同期的に解決できる場合を指す。具体的には、以下の条件を満たすモジュールが同期ESMグラフとみなされる。
1. 同期的な依存関係解決: モジュールおよびその依存モジュールがすべて同期的にロードされ、解決される。これは、モジュールの中にawaitなどの非同期処理が含まれていないことを意味する。
2. モジュールの明示的な定義: モジュールが.mjs拡張子を持つか、またはそのモジュールが含まれるpackage.jsonファイルに"type": "module"というフィールドが明示的に定義されている。
同期ESMグラフでは、モジュールのロードと依存関係の解決が非同期ではなく同期的に行われるため、require()を使って同期的にESモジュールを読み込むことが可能になる。これは通常の動的インポート(import())とは異なり、同期的に実行される点が特徴である。
従来、Node.jsではESモジュールとCommonJSモジュール(require()を使用する従来のモジュールシステム)の間には非互換性があった。しかし、同期ESMグラフの導入により、require()を使ってESモジュールを扱うことが可能になり、両者をよりスムーズに統合できるようになる。これにより、既存のコードベースとの互換性が向上し、モジュールの管理がより柔軟に行えるようになる。
その他の変更点
path: matchesGlobメソッドの追加
pathモジュールに新しいmatchesGlob
メソッドが追加され、特定のパスに対してグロブパターンをテストできるようになった。この機能はAviv Kellerによって#52881で貢献された。
stream: DuplexPair APIの公開
DuplexPair APIが公開され、duplexPair()
関数が追加された。この関数は2つのアイテムを含む配列を返し、それぞれが互いに接続されたDuplexストリームとなる。以下はその例である:
const [sideA, sideB] = duplexPair();
どちらか一方に書き込まれたデータはもう一方で読み取り可能になり、これはクライアントとサーバー間のネットワーク接続に類似した動作を提供する。クライアントが書き込んだデータはサーバーで読み取り可能になり、逆もまた同様である。
詳細はNode.js — Node v20.17.0 (LTS)を参照していただきたい。