📑
ts-nodeでESModulesのファイルを実行する
実行環境
- 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)
この issueやstackoverflowの回答などで同様のエラーが報告されているが、これらを試しても動作しません。
解決策
以下のコマンドで実行できます。
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!
Discussion