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です。(パフォーマンス低下が少し心配ですが。。)