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 とかに書いておける環境変数のほうが取り回しがよさそうに思う。

詳説 データベース ―ストレージエンジンと分散データシステムの仕組み
[ad] 詳説 データベース ―ストレージエンジンと分散データシステムの仕組み
Alex Petrov, 小林 隆浩 (単行本(ソフトカバー))