技術探し

JavaScriptを中心に記事を書いていきます :;(∩´﹏`∩);:

Node.js Package Mode について

github.com

docs.google.com

slides.hiroppy.me

まだ、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.jsonmodeフィールドを追加する。

.jsファイルをESMと見てほしい場合は、以下のように書く。
このときは、ESMなのでrequireは使えない。

{
  "mode": "esm"
}

.jsファイルをCJSと見てほしい場合は、以下のように書く。

{
  "mode": "commonjs"
}

mjsの扱い

.mjsはCJSとESMの両方が使われる時に使うことが理想です。
.mjs + "mode": "commonjs" の設定になります。

さいごに

ESMは今後のデファクトとなるでしょう。
その前にまだNode.jsでは決めることが多くあるので、まだ安定的には長いかもしれません。
そして、これが導入されれば、npm initmodeフラグが追加されユーザーは簡単にESMを扱える未来がありえます。
この簡単なアプローチに自分は+1です。(パフォーマンス低下が少し心配ですが。。)