ESModule形式のTypeScriptファイルをNodeで実行する
実行環境
Windows
OS Name: Microsoft Windows 11 Home
OS Version: 10.0.22621 N/A Build 22621
CPU: 12th Gen Intel(R) Core(TM) i7-12700K 3.60 GHz
Node: v20.12.2
やりたかったこと
画像を扱うWebアプリを作成していた際に、画像処理の挙動確認をスクリプト形式で確かめたくなりました。
アプリへの移植時の互換性を気にしてTypeScript+ESM形式での実行方法を探したのですが、よく見るts-nodeでの実行ではなかなか上手く行かず試行錯誤したので、そのメモを残しておきます。
理想
ts-node ./cmd/clip_image.ts
# >>> clip completed.
現実
ts-node ./cmd/clip_image.ts
# >>> TypeError: Unknown file extension ".ts"
# or
# >>> (node:9408) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
# import { Jimp } from 'jimp';
結論
ts-node
を使わずtsxを使う
ライブラリを切り替えたらうまく動作しました。2025年2月現在Node20系ではこれが最善のようです。
# インストール
npm i -D tsx
# 実行
npx tsx ./cmd/clip_image.ts
# >>> clip complete
試したこと
ts-nodeでの実行
そのまま実行
ts-node ./cmd/clip_image.ts
# >>> (node:13408) Warning: To load an ES module, set "type": "module" in the package.json or use the .mjs extension.
# (Use `node --trace-warnings ...` to show where the warning was created)
# cmd/tempCodeRunnerFile.ts:1
# export {};
"type": "module" の追記
言われた通りにpackage.jsonに"type": "module"を記載して実行
{
"name": "image-app",
"version": "0.1.0",
"private": true,
"type": "module",
}
ts-node ./cmd/clip_image.ts
# >>> TypeError: Unknown file extension ".ts"
mts拡張子での実行
ts-node ./cmd/clip_image.mts
# Error [ERR_REQUIRE_ESM]: Must use import to load ES Module
これはたいして調べずに諦めました。
nodeでの実行
nodeでloaderを指定して実行できるようなので、それも試しました
node --loader ts-node/esm ./cmd/clip_image.ts
#>>> node:internal/process/esm_loader:34
# internalBinding('errors').triggerUncaughtException(
^
# Error [ERR_MODULE_NOT_FOUND]: Cannot find package 'ts-node' imported from C:\Users\hoge\image-app
これは今見るとパスが通っていないだけみたいですが…これでも正しく動いたかもしれません
Node18系の場合はこれで正しく動作するようです。参考
リファレンス
参考にさせていただいた記事
コメント