社内でNode.jsを使用した以下の勉強課題をいただきました。
この記事はJavaScriptで記載されていますが、TypeScriptに直して実行することが今回の課題です。
実行の条件として以下をもらいました。
- TypeScriptで記載すること
- 「require」ではなく、「import」を用いること
- TypeScriptでは「node」コマンドは動かないので、「ts-node」で実行すること
上記条件にて、順にコードを記載していったところ、今回タイトルとして記載している「ts-node」の実行という、だいぶ初歩的なところで躓いたので備忘として整理しておきます。
環境はMac端末にて以下で実行しています。(多分現時点で最新の状態のハズ、、、)
% nodebrew -v
nodebrew 1.2.0
% node -v
v20.5.0
npm -v
9.8.0
概要
コードを記載し、下記コマンドにて「ts-node」を実行。
% ts-node [実行ファイル]
実行結果として以下がエラーとして出力されました。。
エラー内容
TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /実行リポジトリ/index.ts
at new NodeError (node:internal/errors:399:5)
at Object.getFileProtocolModuleFormat [as file:] (node:internal/modules/esm/get_format:79:11)
at defaultGetFormat (node:internal/modules/esm/get_format:121:38)
at defaultLoad (node:internal/modules/esm/load:81:20)
at nextLoad (node:internal/modules/esm/loader:163:28)
at ESMLoader.load (node:internal/modules/esm/loader:605:26)
at ESMLoader.moduleProvider (node:internal/modules/esm/loader:457:22)
at new ModuleJob (node:internal/modules/esm/module_job:64:26)
at ESMLoader.#createModuleJob (node:internal/modules/esm/loader:480:17)
at ESMLoader.getModuleJob (node:internal/modules/esm/loader:434:34) {
code: 'ERR_UNKNOWN_FILE_EXTENSION'
}
解決方法
エラー内容を調べると下記記事を見つけました。
こちらを参考に以下コマンドで実行。
npx tsx [実行ファイル]
結果としては無事にNode環境を立ち上げることができました。
原因調査
エラーになった原因を少し調査してみたところ、下記記事を見つけました。
ts-nodeはESMのTypeScriptでは動作しないことが今回のエラーの原因のようです。
終わりに
今回は「import」を用いることが条件として1つありました。
「ts-node」で実行することも条件としてありましたが、実行で時間を取られるのも癪ですし、動かなければ意味がないので、「ts-node」は諦め、「npx tsx」での実行となりました。
ただ、ほかにも調べてみると「ts-node」 かつ ES Modulesで実行できている参考サイトも多々見受けられたので、別の方法があるのかもしれません。