ESM な TypeScript を node.js で実行するときの設定を検討します.なお,ESM とは以下のように import
を使う方式のことです.
import { valueOfPi } from "./constants"; export const twoPi = valueOfPi * 2;
https://www.typescriptlang.org/ja/tsconfig#module
環境
% sw_vers ProductName: macOS ProductVersion: 13.6.3 % node -v v20.11.0
package.json
ESM を利用するための設定をします.
{ "type": "module", .... }
https://nodejs.org/api/esm.html#enabling
tsconfig.json
{ "$schema": "https://json.schemastore.org/tsconfig", "compilerOptions": { "lib": [ "es2023" ], "module": "node16", "target": "es2022", "strict": true, "esModuleInterop": true, "skipLibCheck": true, "forceConsistentCasingInFileNames": true, "moduleResolution": "node16", "noEmit": true, "allowImportingTsExtensions": true }, "include": [ "src/**/*.ts" ] }
昔はトランスパイルされるはずの js ファイルをインポートしていましたが,allowImportingTsExtensions
を有効にすれば,直接 ts ファイルをインポートできるようになります.
https://www.typescriptlang.org/ja/tsconfig#allowImportingTsExtensions
サンプル
a.ts
export const func = (a: number) => a * 2;
b.ts
import { func } from "./a.ts"; console.log(func(2));
tsx で実行する
TypeScript Execute (tsx): Node.js enhanced to run TypeScript & ESM files
https://github.com/privatenumber/tsx
昔は ts-node
を使っていましたが,こちらの方が高速で正式に ESM をサポートしていますので,乗り換えます.
まずはインストールします.
npm install --save-dev tsx
実行するには tsx
コマンドを使います.
tsx b.ts
先程のサンプルを実行すると,正常に出力されました.
4
まとめ
TypeScript を ESM ですっきりと実行できるようになりました.