tsx vs ts-node (CI): TypeScriptをより速く実行する
ts-nodeはtscの完全なセマンティクスでTypeScriptを実行し、tsxはesbuildを使って型を除去し、type-checkせずに高速に実行します。
ts-nodeはTypeScriptコンパイラ経由でTypeScriptを実行し、型を意識した完全な実行をサポートします。tsxはesbuildを使ってTypeScriptを高速にトランスパイルして実行し、シームレスなESMサポートを備えますが、type-checkは行いません。
| tsx | ts-node | |
|---|---|---|
| エンジン | esbuild(高速) | tsc |
| Type checking | なし(除去のみ) | 任意(より遅い) |
| ESMサポート | シームレス | 動作する(設定が必要) |
| 起動速度 | 非常に高速 | より遅い |
| 最適な用途 | スクリプト/テストを速く実行 | 型を意識した実行 |
CIでは
tsxは起動が速く、わずかな設定でESMを扱えるため、CIでスクリプト、tooling、テストを速く実行するのに理想的です。ts-nodeは実行しながらtype-checkできますが、それは遅いため、ほとんどのpipelineは代わりにtsxのような高速runnerと、型安全のための別途のtsc --noEmitステップを実行します。TypeScriptを速く実行するだけでよいなら、tsxがより軽量な選択です。
type-checkを分離する
高速実行が型安全をスキップしないよう、tsc --noEmitを独自のステップ(並列)として実行します。どちらもmanaged runnerで動作し、高速なmanaged runnerは大きなコードベースでの長いtype-checkパスを短縮します。
結論
TypeScriptのスクリプトとテストを最速で実行したいなら: tsxを、別途のtsc --noEmitチェックと組み合わせる。型を意識した実行を1つのツールで必要とするなら: ts-node。ほとんどのpipelineは高速実行とtype-checkingを分けます。