Node.js Package Mode について

2018 / 08 / 10

Edit
🚨 This article hasn't been updated in over a year
💁‍♀️ This post was copied from Hatena Blog
esm: Implement esm mode flag by guybedford · Pull Request #18392 · nodejs/node This provides a mode: "esm" flag for package.json files which will treat ".js" files as ES modules w...

Node.js Package Mode Node.js Package Mode package.json { “mode”: “esm” }

future-of-node Introduce the current stability 1 modules and hot topics.

まだ、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 initmodeフラグが追加されユーザーは簡単に ESM を扱える未来がありえます。 この簡単なアプローチに自分は+1 です。(パフォーマンス低下が少し心配ですが。。)