tsx対ts-node:CIでTypeScriptを実行する
tsxはesbuild経由でTypeScriptを高速に実行し、ESMを苦もなく扱います。ts-nodeはオプションの型チェックを備えた定評ある実行ツールです。
ts-nodeはNode上でTypeScriptを直接実行し、実行しながらオプションで型チェックを行いますが、ESMのセットアップは面倒になり得ます。tsxはesbuildを動力とする実行ツールで、型を高速に取り除き、ESM/CJSを滑らかに扱いますが、それ自体では型チェックを行いません。
| ts-node | tsx | |
|---|---|---|
| エンジン | tscベース(型認識オプション) | esbuild(トランスパイルのみ) |
| 実行中の型チェック | オプション | なし(tscを別途実行) |
| ESMの使い勝手 | 面倒になり得る | 滑らか |
| 起動速度 | 遅い | 高速 |
| 典型的な用途 | 型安全性を伴うTS実行 | 高速なTSスクリプト / 開発 |
CIにおいて
tsxは、特にESMで、CIでTypeScriptのスクリプトやツールを高速に実行するのに最適です。esbuildでトランスパイルし、速度のために型チェックを省くからです。型安全性のためには別個のtsc --noEmitステップと組み合わせましょう。ts-nodeは実行しながら型チェックができ、スクリプトにはこれを好む人もいますが、より遅く、そのESM設定はCIの失敗の頻繁な原因です(おなじみのERR_UNKNOWN_FILE_EXTENSION / loaderの問題)。
ベストプラクティス
ほとんどのpipelineでは、型チェックはtsc --noEmitで一度実行し、スクリプトは高速なトランスパイルのみの実行ツール(tsx)で実行しましょう。これにより正しさ(型)と実行(速度)が明確に分離され、二重の作業を避けられます。
結論
高速な実行と苦のないESMを、tscによる別個の型チェックステップとともに望むなら:tsx。実行中の型チェックを望み、動作するts-nodeのセットアップがあるなら:ts-node。一般的なパターンは、実行にtsx、型にtscです。
関連ガイド
esbuild vs SWC: Which JS/TS Transpiler for CI?esbuild vs SWC for CI: transpile and bundle speed, language coverage, and integration. Which fast transpiler…
SWC vs Babel: Which JS/TS Transpiler for CI?SWC vs Babel for CI: transpile speed, plugin ecosystem, presets, and compatibility. Which transpiler keeps yo…
How to Speed Up GitHub Actions: 9 High-Impact TacticsMake GitHub Actions faster: caching, parallelization, test splitting, Docker layer caching, slimmer images, a…