Hiroppy
Node.js Package Mode について

Node.js Package Mode について

2018 / 08 / 10
Hiroppy

Hiroppy

JavaScript Engineer


この記事は 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 within a given package boundary. The package boundary of a package.json file i...

github.com
esm: Implement esm mode flag by guybedford · Pull Request #18392 · nodejs/node

Node.js Package Mode

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

docs.google.com
Node.js Package Mode

future-of-node

Introduce the current stability 1 modules and hot topics.

slides.hiroppy.me
future-of-node

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


関連記事