ESModule形式のTypeScriptファイルをNodeで実行する

Typescript

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系の場合はこれで正しく動作するようです。参考

リファレンス

参考にさせていただいた記事

コメント

タイトルとURLをコピーしました