Closure LibraryをClosure Compilerで圧縮(ADVANCED_OPTIMIZATIONS編)
Google Chrome Extension "History Plus"を開発しているときのMemo.
前の記事では、Closure LibraryのCodeをClosure Compilerを使って結合するまでの環境設定や手順とか。
今度は    
--compilation_level=ADVANCED_OPTIMIZATIONS     
を追加して、最小Sizeのjs fileにする方法を試してみた。
環境はWindows 7 Home Premium 64bit (英語版)
実行するだけなら簡単。見やすくするために改行しているけど、実際は1行で実行。
> cd "C:\Users\Owner\Develop\Google Chrome Extension\"    
> C:\Python27\python.exe     
   "closure-library\closure\bin\build\closurebuilder.py"     
   --root="closure-library"     
   --root="History+\src\js"     
   --namespace="historyplus.SearchController"     
   --output_mode=compiled     
   --compiler_jar="compiler.jar"     
   --compiler_flags="--compilation_level=ADVANCED_OPTIMIZATIONS"     
   --output_file="History+\history.min.js"
だけど、下記Errorが出て動かない。
Uncaught Error: Invalid value for argument 1. Property 'Ic': Unexpected property, Property 'dc': Unexpected property.
ここから試行錯誤。
1. まずはClosure Libraryの依存関係について理解する。
jQueryに慣れていると、関数を定義したあと、onreadyもしくはonload時に実行するというやり方になる。下記のような感じ。
window.onload = function(){    
  var ctrl = new historyplus.SearchController();     
};
これだと全て読み込まれた後なので、安心してInstanceを作成することが出来る。
Closure Libraryの場合は依存関係定義Fileを作成して、onReadyを待たずに実行していく方法が推奨されているらしい。下記Siteとかでなぜdeps.jsを構築しているのかやっと理解できた。
Closure Libraryによるアプリ開発のはじめ方 - WebOS Goodies
deps.jsの作り方はOfficial Siteを参考に。
Using DepsWriter - Closure Library - Google Code
--root_with_prefixに渡す値がbase.jsからの相対Pathなので、closure-libraryはLocalにCheckoutし直した。Folder構成は次のような感じ。
PowerShellからCommand実行。
> cd "C:\Users\Owner\Develop\Google Chrome Extension\History+\src"
> C:\Python27\python.exe    
   "closure-library/closure/bin/build/depswriter.py"     
    --root_with_prefix="js ../../../js"     
    --output_file="js\deps.js"
htmlは
<script src="closure-library/closure/goog/base.js"></script>    
<script src="js/deps.js"></script>     
<body>     
...     
<script>goog.require('historyplus.SearchController');</script>     
</body>
これで動作確認。
2. 準備が整ったのでADVANCED_OPTIMIZATIONSしてみる。
> C:\Python27\python.exe    
   "closure-library\closure\bin\build\closurebuilder.py"     
   --root="closure-library"     
   --root="js"     
   --namespace="historyplus.SearchController"     
   --output_mode=compiled     
   --compiler_jar="..\..\compiler.jar"     
   --compiler_flags="--compilation_level=ADVANCED_OPTIMIZATIONS"     
   --output_file="js\history.min.js"
63KBだった。htmlを修正。
<body>    
...     
<script src="js/history.min.js"></script>     
</body>     
これで実行してみると・・・。同じError・・・。ここで気付いた。chrome.history.searchなどのBrowserが提供しているAPIまで置き換えられてしまう。なので、
Closure Compilerに最適化を除外する関数を教えてあげないといけない。
この解決策は下記Siteを参考に。
- Advanced Compilation and Externs - Closure Compiler - Google Code
 - ADVANCED_OPTIMIZATIONS時の注意 - A Developer's Site
 - Get an Externs File of Google Chrome Extensions™ APIs for Closure Compiler™ - A Developer's Site
 
上記Siteを参考にObjectのPropertyの記述方法を変更。除外FileをDownloadしてきて、再度Compile.
> C:\Python27\python.exe    
   "closure-library\closure\bin\build\closurebuilder.py"     
   --root="closure-library"     
   --root="js"     
   --namespace="historyplus.SearchController"     
   --output_mode=compiled     
   --compiler_jar="..\..\compiler.jar"     
   --compiler_flags="--compilation_level=ADVANCED_OPTIMIZATIONS"     
   --compiler_flags="--externs=..\..\chrome_extensions_ja_stable_Simple.js"     
   --output_file="js\history.min.js"
でもErrorが取れない。
Propertyが置き換えられるときと、そうでないときがあるのが謎。解決に時間かかりそうなので、ADVANCED_OPTIMIZATIONS付けないで公開することにした。
> C:\Python27\python.exe    
   "closure-library\closure\bin\build\closurebuilder.py"     
   --root="closure-library"     
   --root="js"  
   --namespace="historyplus.SearchController"     
   --output_mode=compiled     
   --compiler_jar="..\..\compiler.jar"     
   --output_file="js\history.min.js"
< Related Posts >