created: 2023-04-04T09:45:43.444Z
ts-node で Warning: To load an ES module ... エラーが出るとき
ts-node でTypeScriptのファイルを1つだけ実行しようとした場合にこんなエラーが出る。
(node:30757) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
原因
おそらく多くの場合は以下の原因で発生するエラー。
tsconfig.json#module
の設定がesnext
などになっている- tsc がトランスパイルした jsファイルは ESModule 形式になる
- nodejs はオプションをつけたりファイル名を工夫しないと ESModule を実行できない
- nodejs と tsc を使って動いている ts-node はエラーになる
対応
「tsconfig.json
の設定を commonjs
に変えよう」みたいな記事が出てくるけど、だいたい ts-node をつかうときは、そのワンショットを実行するときだけ tsconfig.json
の設定を上書きしたいことが多いだろう。
環境変数TS_NODE_COMPILER_OPTIONS
をつけて実行すれば設定を一部分上書きしてスクリプトを実行できる。
TS_NODE_COMPILER_OPTIONS='{"module":"commonjs"}' npx ts-node ./src/index.ts
--compilerOptions='{"module":"commonjs"}'
でもよいようだが、個人的には .envrc
とかに書いておける環境変数のほうが取り回しがよさそうに思う。