【実務・中級編】 ts-nodeの設定とregisterオプション – TypeScript実践ガイド

やあ。TypeScriptの深淵へようこそ。

現場でバリバリコードを書いている君なら、一度はこんな経験があるはずだ。「ちょっとしたスクリプトを動かすためだけに、わざわざ`tsc`でビルドして`node`で実行するのが面倒くさい」あるいは「開発サーバーの起動が遅くてイライラする」。

そんな時、僕らが頼るのが`ts-node`だ。だが、多くのエンジニアが「なんとなく動いているから」という理由で、デフォルト設定のまま使い捨てている。それは非常にもったいない。本番環境のCIや、大規模なモノレポ開発で「なぜか遅い」「なぜか型エラーを無視してしまう」といった沼にハマらないための、プロの作法を伝授しよう。

—

1. ts-nodeの正体と「なぜ遅いのか」を理解する

まず、TypeScriptはブラウザやNode.jsが直接解釈できる言語ではない。`ts-node`がやっていることは、裏側で「TypeScriptをJavaScriptに変換(トランスパイル)」し、「それをNode.jsに流し込む」という二段構えだ。

デフォルトの`ts-node`は、実行のたびに型チェックを行う。これが便利である反面、コードベースが大きくなればなるほど、実行までの待ち時間が指数関数的に増えていく原因になる。大規模プロジェクトでこれをやると、コーヒーを淹れる時間すらなくなるだろう。

2. 実践:現場で使える最強のtsconfig戦略

`ts-node`には`tsconfig.json`を明示的に食わせる必要がある。プロジェクトルートに専用のスクリプト用設定を用意し、`transpileOnly`オプションを使いこなすのが賢いエンジニアの定石だ。

推奨構成:`tsconfig.ts-node.json`

プロジェクト直下に、実行専用の設定ファイルを作ろう。

{
“extends”: “./tsconfig.json”, // 基本設定を継承
“ts-node”: {
“transpileOnly”: true, // 型チェックをスキップして爆速化する(必須)
“compilerOptions”: {
“module”: “commonjs” // Node.js環境ではこれが安全
}
},
“compilerOptions”: {
“noEmit”: true // ts-nodeで変換結果を出力しない(不要なjsファイルを残さない)
}
}

なぜ `transpileOnly` が重要なのか

このオプションは、TypeScriptコンパイラが本来行う「型チェック」を放棄し、単なる「コードの変換(剥ぎ取り)」に徹させるものだ。型エラーがあっても実行できてしまうため、運用には注意が必要だが、開発中のイテレーション速度は劇的に変わる。型チェックは、CIやIDEのリアルタイムチェックに任せればいい。

—

3. 環境変数による制御と運用の自動化

現場では、同じスクリプトでも「開発時は速く、デプロイ時は堅牢に」といった切り替えが求められる。コマンドラインで毎回オプションを指定するのはヒューマンエラーの元だ。

`package.json`のスクリプト定義で、環境変数を活用しよう。

{
“scripts”: {
“start:dev”: “ts-node –project tsconfig.ts-node.json src/index.ts”,
“start:strict”: “TS_NODE_TRANSPILE_ONLY=false ts-node src/index.ts”
}
}

ここで重要なのは、`ts-node`が環境変数 `TS_NODE_…` を読み取れるという仕様だ。もしあなたがDocker上でCIを回しているなら、環境変数で制御することで、設定ファイルをわざわざ書き換えることなく挙動を柔軟にコントロールできる。

—

4. チーフアーキテクトからのアドバイス:registerオプションの罠

たまに「`–require ts-node/register`」というオプションを目にするだろう。これは、テストフレームワーク(MochaやJestなど)からTypeScriptファイルを直接読み込ませる際に使う。

しかし、最近のトレンドとしては、「可能な限り`ts-node`自体を直接叩かず、`esbuild-register` や `tsx` といったモダンなツールへの移行を検討すること」を強く勧める。

`ts-node`は歴史あるツールだが、Node.jsのES Modules(`import`/`export`)との相性がやや複雑で、設定に手間取ることが多い。もし今、新規にプロジェクトを立ち上げる、あるいはスクリプト実行を高速化したいだけなら、以下のように試してみてほしい。

ts-nodeの代わりにtsxを使うと、設定不要で爆速かつESMも快適に動く
npx tsx src/index.ts

—

まとめ:現場で生き残るための心得

1. 設定ファイルを分離せよ: `tsconfig.json`と`ts-node`用の設定は分け、継承を活用する。
2. `transpileOnly` は諸刃の剣: 開発効率と引き換えに型チェックを捨てる。その代わり、エディタ上での型エラー検知をサボらないこと。
3. ツールの固定観念を捨てよ: `ts-node`がベストとは限らない。`tsx`のような軽量で現代的な代替品も常に視野に入れること。

TypeScriptは、ツールに振り回されるのではなく、君がツールを飼いならすものだ。環境構築で悩んでいる時間は、コードを書いて価値を生み出す時間に変えられる。

また何かあったら聞きに来い。現場からは以上だ。

コメント

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