📑

ts-nodeでESModulesのファイルを実行する

1 min read

2021/02/06 時点の情報です。

実行環境

  • Node.js 14.14.0
  • yarn 1.22.5
  • package.json("type": "module"で ESModules を有効化していることに注意。)
{
  "name": "sample",
  "version": "1.0.0",
  "license": "MIT",
  "type": "module",
  "devDependencies": {
    "@types/node": "^14.14.25",
    "ts-node": "^9.1.1",
    "typescript": "^4.1.3"
  }
}

課題

以下のスクリプトを例にする。

sample.ts

import { appendFile } from 'fs';

appendFile('test.txt', 'Hello content!', (err) => {
  if (err) throw err;
  console.log('saved!');
});

これを単に ts-node で実行すると次のエラーが発生する。

yarn ts-node sample.ts

TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for .../sample.ts
    at Loader.defaultGetFormat [as _getFormat] (internal/modules/esm/get_format.js:65:15)
    at Loader.getFormat (internal/modules/esm/loader.js:101:42)
    at Loader.getModuleJob (internal/modules/esm/loader.js:230:31)
    at Loader.import (internal/modules/esm/loader.js:164:17)
    at Object.loadESM (internal/process/esm_loader.js:68:5)

この issuestackoverflowの回答などで同様のエラーが報告されているが、これらを試しても動作しません。

解決策

以下のコマンドで実行できます。

yarn node --loader ts-node/esm sample.ts

❯ yarn node --loader ts-node/esm src/index.ts
yarn node v1.22.5
(node:67012) ExperimentalWarning: --experimental-loader is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
saved!