Node.js Package Mode について
まだ、masterへ入っていないので、未確定です。
今は、Coreで開発するかhttp2の様な感じでupstreamで開発するやsemverの扱い等の開発指針を決めたところです。
現在のNode.jsのECMAScript Modulesに対する問題点
ESMを使用する場合、現在はファイルの拡張子を.mjsにする必要があるが可能であれば、ユーザーは.jsファイルで書きたい。
Node.js Package Mode
modeフラグがesmの場合、package.jsonを軸に次の package.json までにネストされたフォルダとサブフォルダをすべて ESM とみなす仕様(そしてつぎpackage.jsonのフラグがesmの場合は続く)
もしpackage.jsonがない場合は、デフォルトでcommonjsとなります。
つまり、フラグを書くことによりそのpackage.jsonのフォーカスにあるプロジェクトは.jsでもESMとして扱われます。
また、これはpackage-mimes デザインと同様のアルゴリズムになっています。
これによるユーザーランドの破壊的変更は存在せず、単純でビルドツールとの互換性もあります。
使い方
package.jsonにmodeフィールドを追加する。
.jsファイルをESMと見てほしい場合は、以下のように書く。
このときは、ESMなのでrequireは使えない。
{ "mode": "esm" }
.jsファイルをCJSと見てほしい場合は、以下のように書く。
{ "mode": "commonjs" }
mjsの扱い
.mjsはCJSとESMの両方が使われる時に使うことが理想です。
.mjs + "mode": "commonjs" の設定になります。
さいごに
ESMは今後のデファクトとなるでしょう。
その前にまだNode.jsでは決めることが多くあるので、まだ安定的には長いかもしれません。
そして、これが導入されれば、npm init にmodeフラグが追加されユーザーは簡単にESMを扱える未来がありえます。
この簡単なアプローチに自分は+1です。(パフォーマンス低下が少し心配ですが。。)