おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

Closure Compiler Compilation Levels

googleが出してるjavascriptの圧縮ツールClosure Compilerには

  • WHITESPACE_ONLY
  • SIMPLE_OPTIMIZATINS
  • ADVANCED_OPTIMIZATIONS

の三つのレベル設定があります。でもそれぞれどのような圧縮をしてくれるのかよくわかりませんね。そこで調べました。下記URLの意訳です。

Closure Compiler Compilation Levels - Closure Compiler - Google Code

WHITESPACE_ONLY

  • コメント
  • 改行
  • 不必要な空白
  • スペース

を削除する。元となるJavaScriptと中身的に同じコードを出力する。3つの中で一番圧縮率が低い

SIMPLE_OPTIMIZATIONS

  • WHITESPACE_ONLYと同じようにコメントや空白を削除
  • ローカル変数や関数のパラメータを短い名前に変更する
  • ローカルの変数や関数のみ変更するので、他のJavaScriptファイルとの相互的な利用を邪魔しない
  • SIMPLE_OPTIMIZATIONSでコンパイルしても文法的にはvalidなJavaScriptになる(例えばeval()でローカル変数にアクセスしたりはしない)。
  • デフォルトのコンパイルレベル

ADVANCED_OPTIMIZATIONS

このレベルはコードの推測をおこなうので、コードがその推測に沿っていないとうまく実行できないコードが生成されたりする。

例えば、このレベルでコンパイルしたコードはコンパイルしてないコードと同時に使うとうまく動かないかもしれない。圧縮するコードが外部の関数やプロパティを参照していない時に、Closure Compilerは不適切な名前変更をして(名前がかぶったりするってことかな?)してうまく動かなくなる。

まとめると

  • SIMPLE_OPTIMIZATIONSの圧縮に加えて、global変数や関数やプロパティの名前も変更する
  • 使わないコードは削除する。大きなライブラリを使う時などに有効。
  • いくつかの関数呼び出しを関数の実態に置き換える。この変換は"inlining"として知られてる。inliningしても安全でコードが短くなるときのみそうしてる。定数的に扱われている変数なども同じように置き換えられる。

Closure Compiler Documentation - Closure Compiler - Google Code