package.jsonのmodule
これはNode.jsがサポートしているfieldではない
そのため、Node.jsのdocsに説明はない
例
code:package.json
{
"main": "./index.js",
"module": "./esm/index.js"
}
moduleはbundler用の非標準なfield
この辺の変遷、追うの辛すぎmrsekut.icon
これ、2024/9/27現在も知る必要のある知識なのだろうか #?? 2022
moduleフィールドは Node.js によって公式に定義されておらず、サポートは計画されていません。 その代わりに、Node.jsコミュニティは、より汎用的であると考えるpackage.jsonのexportsに落ち着きました。 実用的な理由から、JavaScriptバンドルはmoduleフィールドをサポートし続けます。
し続けるんかいmrsekut.icon
esbuildのドキュメントでは、mainとbrowserの関連フィールドと同様に、moduleを使用するタイミングを説明しています。
このフィールドは、ECMAScriptモジュールをNode.jsに統合するための提案から生まれたものです。
そのため、このフィールドに指定されたファイルパスがECMAScriptスタイルのモジュールであると期待されます。
しかし、ECMAScriptスタイルのモジュールはツリーシェイキングを効率的に行えるため、主要なバンドラーではこの提案が採用されています。
パッケージ作成者向けの注意点
一部のパッケージでは、ブラウザ専用のコードにmoduleフィールドを誤って使用し、Node.js専用のコードをmainフィールドに残すという使い方が見られます。これは、おそらくNode.jsがmoduleフィールドを無視するため、通常ブラウザ専用のコードにはバンドラーのみを使用するという慣習があるからです。
しかし、Node.js専用のコードをバンドリングすることにも価値があります(例えば、ダウンロード時間や起動時間を短縮できる)。moduleフィールドにブラウザ専用のコードを置くと、バンドラーが効果的にツリーシェイキングを行えなくなります。ブラウザ専用のコードをパッケージで公開する場合は、moduleフィールドではなく、browserフィールドを使用することを推奨します。
ESMの静的解析のしやすさを利用するため、Node.jsがESMに対応する前からバンドラーはESMを利用していました。
前述した通り、ESMに対応していない実行環境でESMの記述を行うとエラーになるため、CJSとESMの両対応のファイルを置くことはできません(mainフィールドをESMのファイルにするとNode.jsで実行できなくなる)。そのため、ESMのファイルを指すエントリーポイント用のフィールドとして、このmoduleフィールドが非標準で用意されました。