Closure Compilerを使う!
コンパイルレベル
最終更新:
aias-closurecompiler
トップページ >
コンパイルレベル
Closure Compilerは以下の3段階のコンパイルレベル(最適化レベルとも呼ばれます)を提供します。コンパイルレベルとは単純なコメントと改行の除去からコード全体に対する大胆な変換処理に至る、コード圧縮の強度のことです。
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のルールを深く理解していること
- コンパイル後に十分な(できれば自動化された)テストの実施が保証されていること