npm packageは4種類ある
参考
package.jsonでのmainとexportsについて
mainは単に古い書き方で、全部exportsで書き換えれる
exportsの方ができることが多いので、「mainなら確定的にこうなる」というのはあり得る
関係ないのであれば、↓の書き方はおかしい
CJS Package
CJS形式のみで配布
CJS/ESMから使用可能
例
code:package.json
{
"main": "./index.js"
}
mainを使っているかexportsを使っているかはあまり関係ない
とにかく、
Node.jsではCJS形式で動作し、バンドラー (Webpack等) ではFake ESM形式で動作する。フロントエンド向けパッケージではまだこの形式が優勢。ref code:package.json
{
"main": "./index.js",
"module": "./esm/index.js"
}
普通、Dual Packageと呼ぶ時はこちらを指すのでは?
呼び出し元のモジュール種別に応じてCJSまたはNative ESM形式で動作する。ref code:package.json
{
"exports": {
"require": "./index.js",
"import": "./esm/index.mjs"
}
}
Native ESM Package
CJSからは使えない
例
code:package.json
{
"type": "module",
"exports": "./index.js"
}