「ビルドが遅い」は甘えではない。`skipDefaultLibCheck` で無駄な型チェックを削ぎ落とせ
フロントエンドの現場で「TypeScriptのビルドが遅い」と嘆くのは、ある意味で成長の証だ。プロジェクトが巨大化し、依存関係が複雑になればなるほど、コンパイラの負荷は指数関数的に増大していく。
今日は、その「重さ」に悩む中級エンジニア諸君に向けて、即効性のある最適化策――`skipDefaultLibCheck` について語ろうと思う。これは単なる「設定の一つ」ではない。TypeScriptの仕組みを理解し、コンパイラの「やるべき仕事」と「サボってもいい仕事」を峻別する、アーキテクトとしての最初の仕事だ。
なぜ、標準ライブラリを毎回チェックする必要があるのか?
TypeScriptで開発をしていると、裏側では常に `lib.d.ts`(`lib.dom.d.ts` や `lib.es2022.d.ts` など)という巨大な定義ファイルが読み込まれている。これらは、JavaScriptの標準機能やブラウザAPIの型定義だ。
デフォルトでは、TypeScriptはビルドのたびにこれらの定義ファイルまで含めて「すべて」をチェックする。だが、考えてみてほしい。我々が書いたコードの修正に対して、ECMAScriptの標準仕様やブラウザのDOM定義まで型チェックし直す必要があるだろうか?
答えはノーだ。標準ライブラリの中身は、君が書いたコードによって変わることはない。それなのに、毎回コンパイラが「`window.document` の定義は正しいか?」「`Array.prototype.map` のシグネチャは仕様通りか?」と確認しているとしたら……それは明らかなリソースの無駄遣いだ。
skipDefaultLibCheck の正体と威力
`tsconfig.json` にある `skipDefaultLibCheck: true` は、まさにこの「不変な定義ファイル」のチェックをスキップさせるためのスイッチだ。
これを `true` にするだけで、ビルド時間は驚くほど短縮される。プロジェクトの規模が大きければ大きいほど、数秒から数十秒単位での高速化が見込めるはずだ。
実践:tsconfig.json の設定例
現場で即座に適用できる設定はこれだ。
{
“compilerOptions”: {
/
- 基本設定
/
“target”: “ESNext”,
“module”: “ESNext”,
/
- ここが本題!
- 全ての宣言ファイルの型チェックをスキップするのではなく、
- 「デフォルトのライブラリ(lib.d.ts)」のチェックをスキップする。
- これにより、コンパイラの負荷を劇的に軽減できる。
/
“skipDefaultLibCheck”: true,
/
- 補足: もし node_modules 内の型定義まで甘くしたい場合は
- skipLibCheck: true を併用するが、まずは安全な
- skipDefaultLibCheck から始めるのがプロの流儀だ。
/
“skipLibCheck”: false,
“strict”: true
}
}
なぜ「中級者」こそこれを意識すべきなのか
初心者のうちは「とりあえず動く」ことが正義だが、中級者となると「開発体験(DX)」に責任を持つ必要がある。ビルド時間が1分短縮されるということは、チーム全員の1日あたりの合計作業時間を考えれば、数時間分の生産性向上に直結する。
ただし、注意点も一つ伝えておこう。`skipDefaultLibCheck` はあくまで「標準定義のチェックを省く」ものだ。もし君が `node_modules` のサードパーティライブラリまで含めて型エラーに悩まされているなら、それは別の設定である `skipLibCheck: true` を検討するフェーズに来ている。
しかし、まずは「標準ライブラリ」という、プロジェクト全体で共有される最も巨大な依存先を切り離すことから始めよう。
最後に:エンジニアとしての嗅覚を研ぎ澄ませ
TypeScriptのコンパイラは優秀だが、魔法ではない。我々エンジニアが「どこをチェックし、どこをスキップすべきか」を指示してやる必要がある。
「ビルドが遅いから、新しいPCを買う」と嘆く前に、まずは `tsconfig.json` を開いてみろ。そこに眠っている設定一つで、開発環境は劇的に改善する。これこそが、ツールに振り回されるのではなく、ツールを使いこなすアーキテクトの仕事だ。
次回のビルドボタンを押すとき、コンパイラが少しだけ軽やかに動くことを祈っている。もしそれでも遅いなら、その時はまた別の技術的なボトルネックを一緒に探しに行こう。現場からは以上だ。

コメント