TypeScriptの「incrementalビルド」を語らずして、大規模開発は語れない。
やあ、フロントエンドの現場で日々コードと格闘している諸君。
今日は`tsconfig.json`の数あるプロパティの中でも、中級者以上が必ずぶつかる「ビルド時間の増大」という壁を突破するための鍵、`tsBuildInfoFile`について深掘りしていこう。
多くのエンジニアが「なんとなく」設定して放置しているこの項目だが、大規模なプロジェクトでこれを疎かにすると、CI/CDのパイプラインが悲鳴を上げ、君たちの貴重な開発時間が奪われることになる。今日はこのファイルの「正体」と「現場で活きる管理術」を叩き込む。
—
1. なぜ「tsBuildInfoFile」が必要なのか?
TypeScriptのコンパイラ(`tsc`)は、デフォルトでは「毎回ゼロから全ファイルを解析する」という、極めて誠実だが非効率なアプローチをとる。プロジェクトが数千ファイルを超えてくると、この待ち時間は地獄だ。
そこで登場するのが `incremental: true` だ。これを有効にすると、`tsc` は前回のビルド結果をキャッシュとして保存し、変更があったファイルだけを再コンパイルするようになる。
この「キャッシュの保存場所」を指定するのが `tsBuildInfoFile` だ。
もしこれを指定しないと、デフォルトで `tsconfig.tsbuildinfo` という名前のファイルが生成される。これがルートディレクトリに散らばっているプロジェクト、見たことないか? あれは「管理放棄」のサインだ。
—
2. ブラウザとコンパイラの裏側:なぜ「出力先」が重要なのか
勘違いしている人が多いが、`tsBuildInfoFile` はブラウザが直接読み込むものではない。これはTypeScriptコンパイラが「型チェックの差分」を計算するために使うグラフ情報だ。
しかし、このファイルの扱いをミスると、以下のような「現場あるある」な事故が起きる。
- Gitの差分ノイズ: `dist` フォルダやルート直下に生成され、コミット時に意図せず混入する。
- クリーンビルド時の競合: CI環境でキャッシュが正しくマウントされず、毎回フルビルドが走る。
- ビルドアーティファクトの汚染: ビルド生成物がどこにあるか不明瞭になり、デプロイ設定が複雑化する。
プロの現場では、「ビルド生成物は一箇所にまとめ、Git管理外にする」のが鉄則だ。
—
3. 実践:現場で即採用できる `tsconfig.json` の構成
プロジェクトの規模が大きくなると、`tsconfig.json` は継承(`extends`)を使うのが当たり前だ。ここでは、保守性とパフォーマンスを両立させる構成例を紹介しよう。
{
“compilerOptions”: {
/ インクリメンタルビルドを有効化 /
“incremental”: true,
/ ビルド情報ファイルの出力先を明示的に指定 /
/ .tsbuildinfo はビルド成果物用ディレクトリに集約するのが吉 /
“tsBuildInfoFile”: “./dist/tsconfig.tsbuildinfo”,
/ 成果物の出力先 /
“outDir”: “./dist”,
/ その他、現場で必須の最適化オプション /
“skipLibCheck”: true,
“composite”: true,
“strict”: true
}
}
なぜ `./dist/` に置くのか?
シンプルだ。`dist`(あるいは `build`)ディレクトリは、多くの場合 `.gitignore` に含まれているはずだからだ。開発者が手動で削除する必要もなく、CI上のクリーンアップも `rm -rf dist` 一発で済む。これが「運用コストを下げる」ということだ。
—
4. シニアからのアドバイス:運用上の落とし穴
`tsBuildInfoFile` を導入する際、以下の3点だけは必ずチームの意識として共有してほしい。
1. CI環境でのキャッシング:
GitHub Actionsなどを使う場合、`tsBuildInfoFile` が生成されるディレクトリを `actions/cache` で保存するように設定せよ。これだけで、CIのビルド時間は劇的に短縮される。
2. 型定義の複雑化:
`incremental` ビルドは魔法ではない。`d.ts` の依存関係が複雑すぎると、結局フルビルドに近いコストがかかる。もし「ビルドが遅いな」と感じたら、`tsBuildInfoFile` の設定よりも先に、`tsconfig` の `paths` や不要な依存関係の整理を優先すること。
3. チーム開発でのコンフリクトは起きない:
`tsBuildInfoFile` はローカルのビルド状態に依存するため、Gitで共有する必要はない。むしろ共有してはいけない。`.gitignore` に `.tsbuildinfo` を追加するのは必須の儀式だ。
—
最後に
`tsBuildInfoFile` の設定は、単なる一行の記述に過ぎない。しかし、その背後には「ビルド環境をいかにクリーンに保ち、チーム全体の生産性を最大化するか」というアーキテクトの思想が隠されている。
「公式がそう言っているから」ではなく、「なぜその場所にファイルを置くのか」を説明できるエンジニアになってほしい。それが、君を中級から「選ばれるエンジニア」へと押し上げる一歩になるはずだ。
さて、コードに戻ろう。君たちのプロジェクトが、今日も高速にビルドされることを願っているよ。

コメント