コード圧縮(ミニファイ)がファイルに実際にすること
変数の短縮、空白の除去、不要コードの削除 — そしてスキップすべきタイミング。
どんな大規模ウェブサイトのソースコードを見ても、圧縮された読めないJavaScriptの壁が広がっています。変数名は一文字。空白なし。すべてが一行。
それがミニファイされたコードです。そしてそれには十分な理由があります。
ミニファイが行うこと
ミニファイはブラウザがコードを実行するのに不要なものすべてを削除してファイルサイズを縮小します。コードの動作は完全に同じ。ただ小さくなるだけです。
空白の除去。 コードを読みやすくするスペース、タブ、改行?ブラウザは気にしません。削除。
コメントの除去。 コメントは人間のためのもの。ブラウザはどうせスキップします。削除。
変数名の短縮。 説明的に名付けた userAuthenticationToken が a になります。コードは同じように動きます。
不要コードの削除。 呼ばれない関数、読まれない変数、絶対に実行されないコードパス。高度なミニファイアがこれらを検出して除去します。
文の最適化。 if (condition) { return true; } else { return false; } が return condition になります。同じロジック、少ないバイト数。
実際の数字
削減効果はかなりのものです。JavaScriptの典型的な削減率:
| 手法 | サイズ削減 | |------|----------| | 空白 + コメント | 30-40% | | 変数名の短縮 | 10-20% | | 不要コード削除 | 5-15% | | 文の最適化 | 2-5% | | 合計(gzip前) | 40-60% | | gzip圧縮適用時 | 70-85% |
500KBのJavaScriptバンドルはミニファイ後に通常200-300KBになり、gzip後は75-150KBになります。ページ読み込みのたびに実際の帯域幅を節約できます。
CSSも同様の処理を受けます。空白の除去、カラーコードの短縮(#ffffff を #fff に)、重複セレクターの統合で、CSSは通常30-50%削減されます。
開発 vs 本番
ミニファイされたコードで作業してはいけません。読めないしデバッグが不可能です。
ビルドパイプラインがこれを自動的に処理すべきです:
- 開発: コメントと説明的な名前がある原本の可読コード
- 本番: ビルドツールが生成した最適化出力
ほとんどのモダンフレームワーク(Next.js、Vite、webpack)はこれを標準で行います。きれいなコードを書けば、ビルドツールが最適化された出力を作ります。
ソースマップ:ミニファイされたコードのデバッグ
ソースマップはミニファイされた本番コードと元のソースの橋渡しです。ミニファイされたコードの各位置を元の場所にマッピングする別ファイル(通常 .map)です。
本番でエラーが発生すると、スタックトレースは app.min.js の1行目、34872列目を指します。役に立ちません。しかしソースマップがあれば、ブラウザの開発者ツール(またはエラー追跡サービス)が元のファイル、行番号、変数名を表示できます。
ソースマップは:
- ビルドプロセス中に生成すべき
- エラー追跡ツール(Sentry、Bugsnagなど)で利用可能にすべき
- 本番で公開アクセスできないようにすべき(ソースコードが露出するため)
ミニファイすべきでないとき
開発中。 当然。コードを読みデバッグする必要があります。
公開するライブラリ。 ミニファイ版と非ミニファイ版の両方を提供しましょう。利用者に選ばせましょう。
サーバーサイドコード。 Node.jsはファイルサイズを気にしません。ファイルは一度だけ読み込まれます。サーバーコードのミニファイはデバッグを難しくするだけです。
HTML(通常)。 HTMLミニファイの削減効果は小さく(10-15%)、時々問題を引き起こすことがあります。リスクとリターンの比率が良くありません。ほとんどのチームはスキップします。
ミニファイを超えて
ミニファイはパフォーマンスパズルの一ピースに過ぎません:
Gzip/Brotli圧縮。 サーバーがレスポンスを圧縮します。ミニファイと組み合わせると最大の効果。
コード分割。 すべてのJavaScriptを一度に送らないでください。ルートや機能ごとに分割し、必要に応じてロードします。
ツリーシェイキング。 ライブラリから使う関数だけをインポートし、残りはバンドラーに除去させます。
テキスト差分で元のコードとミニファイされたコードを横並びで比較したり、文字カウンターで正確なサイズ削減を測定できます。
ミニファイは無料のパフォーマンス改善です。ビルドパイプラインに一度設定したら忘れてください。ユーザーはより速い読み込みを得られ、帯域幅コストを節約でき、コードは大切な場所で――エディタの中で――読みやすいまま残ります。