Closure Compilerを使う!

コンパイルレベル

最終更新:

aias-closurecompiler

- view
管理者のみ編集可

トップページ >

コンパイルレベル

Closure Compilerは以下の3段階のコンパイルレベル(最適化レベルとも呼ばれます)を提供します。コンパイルレベルとは単純なコメントと改行の除去からコード全体に対する大胆な変換処理に至る、コード圧縮の強度のことです。

  • コンパイルレベルの具体的な設定方法については、各方式の使い方の説明を参照してください。
  • Compilerの処理対象となるコードには、コンパイルレベルに応じて様々なコーディングルールが課せられます。詳しくはこちらを参照してください。
  • このページは公式サイトのこちらを元に作成しました。

WHITE_SPACE_ONLY

WHITE_SPACE_ONLY は最も圧縮強度の弱いコンパイルレベルで、コメント、改行、不要なスペース、タブなどその他の空白だけを除去します。この処理によってJavaScriptの動作が影響を受けることはありません。

このレベルはコードの変更範囲が小さいという意味では最も安全ですが、圧縮率は3段階中最も低くなります。

SIMPLE_OPTIMIZATIONS

SIMPLE_OPTIMIZATIONS WHITE_SPACE_ONLY と同じコメントと空白の削除に加え、ローカル変数と関数パラメータの名称短縮を含む、式と関数の最適化を行ないます。この処理によってコードサイズはかなり小さくなります。 SIMPLE_OPTIMIZATIONS レベルでは関数内のローカルシンボルだけをリネームするため、コンパイルされたコードとそうでないコードの間の連携を妨げることはありません。

SIMPLE_OPTIMIZATIONS はデフォルトのコンパイルレベルです。

ADVANCED_OPTIMIZATIONS

ADVANCED_OPTIMIZATIONS SIMPLE_OPTIMIZATIONS と同じ処理に加え、以下に示すより大胆なコード変換によって、3つの段階の中で(だけでなく、他の圧縮ツールと比較しても)最高のサイズ圧縮率を実現します。

  • 積極的なリネーム

    SIMPLE_OPTIMIZATIONS では関数内の引数と変数だけがリネームされましたが、 ADVANCED_OPTIMIZATIONS はグローバルな変数・関数・プロパティをリネームし、コードの長さを短縮します。

  • 不使用コードの削除

    ADVANCED_OPTIMIZATIONS は実行されないと考えられるコードを削除します。この機能は大きなライブラリを含むコードをコンパイルするときに特に有効です。もしライブラリ内の少しの関数しか利用されていないのであれば、Compilerがそれら以外のコードを全て削除してくれるからです。

  • 関数のインライン化

    ADVANCED_OPTIMIZATIONS は、それが安全であり、サイズ圧縮に有効であると判断した場合、関数の呼び出しを関数の内容そのものに置き換えます。この処理は一般にインライン化として知られています。同様に、定数やCompilerが置き換えても安全であると判断した変数もインライン化されます。

高い圧縮率を可能にするため、 ADVANCED_OPTIMIZATIONS はコンパイルするコードに強い制約を課します。コードがこの制約に適合していない場合、出力されたコードはおそらく正常に動作しません。

一例として、 ADVANCED_OPTIMIZATIONS レベルでコンパイルされたコードは、特別な手順を踏まなければコンパイルされていないコードと相互に連携することができません。外部からの参照を使用していると明記されていない関数やプロパティはClosure Compilerによってリネームされてしまうため、コンパイル後のコードと外部のコードの間で名前のミスマッチが発生することになるからです。

ADVANCED_OPTIMIZATIONS レベルにおけるコーディングルールの詳細については、こちらを参照してください。

ADVANCED_OPTIMIZATIONS導入の条件

管理人の個人的な意見ですが、以下の条件が満たされていなければ、 ADVANCED_OPTIMIZATIONS レベルの導入はアプリケーションを不安定化させる要因となる危険性が高いように思われます:

  • コーディングを行うメンバ全員がCompilerのルールを深く理解していること
  • コンパイル後に十分な(できれば自動化された)テストの実施が保証されていること