よいまとめだったのでメモ。

拡張子

  • .js -> 基本はCommonJS。package.json次第で挙動が変わる
  • .mjs -> ESM
  • .cjs -> CommonJS

package.jsonのtype

  • "type": "module" -> そのディレクトリ以下は .js をESM扱い
  • "type": "commonjs" -> そのディレクトリ以下は .js をCommonJS扱い

読み込み

  • ESMからCommonJS -> できる
  • CommonJSからESM -> できない(DynamicImportならできる)

で、どうするの?

package.json"type": "module" を設定 && tsconfig.jsoncompilerOptions.moduleNodeNextを設定」をして「 .js でESMを利用する」状態で作る。