Node.js Package Mode について
2018 / 08 / 10
Editまだ、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 です。(パフォーマンス低下が少し心配ですが。。)