ECMAScript Module Support in Node.js

TL;DR

Node.jsのESMとTSサポートがなかなかに複雑なので以下にメモした。

https://ringtail003-til.firebaseapp.com/posts/2023-04-19-07-51

TS4.5の時点ではNode.js ESMはNightly Buildでの実験的機能だったが、4.7で晴れてStableになった。 tsconfig.jsonのmodule指定が node12 から node16 に変わる。

node16

tsconfig.json
"module": "node16" 
  • Top Level Awaitが使用できる。

  • import / exportがそのままJSに出力される。

  • requireやmoduleは使用できない。

  • exportsで .mjs/.d.mts .cjs/.d.cts が出し分けできる。

commonjs

tsconfig.json
"module": "commonjs"
  • require / module.exports = に変換される。

package.jsonのexports

出力ファイルがESM/CommonJSどちらからも読み込めるよう、詳細な指定を記述できるようになった。 従来の types main よりも優先される。

package.json
exports: {
  ".": {
    require: {
      types: "./lib/index.d.cts",
      default: "./lib/index.cjs",
    },
    import: {
      types: "./lib/index.d.mts",
      default: "./lib/index.mjs",
    }
  }
},
types: "./types/index.d.ts", // Fall-back for older versions
main: "./lib/index.cjs", // Fall-back for older versions

Last updated