下記が非常に参考になった。
Closure Library で作る簡易ドローツール(Python Hack-a-thon #3 資料) - WebOS Goodies
まだまだ日本語情報が少ない中、Closure Tools に関する貴重な情報がたくさん載っている。
このページの中の「JavaScriptファイルの圧縮」を参考にして、Closure Library を使った簡単な JavaScriptをコンパイルしてみる。
レシピ
まず HTMLファイル:html/button-min.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script src="http://closure-library.googlecode.com/svn/trunk/closure/goog/base.js"></script>
<script src="/js/button.js"></script>
<link rel="stylesheet" href="/css/dialog.css">
<link rel="stylesheet" href="/css/button.css">
</head>
<body>
<h1>Closure Libraray: button sample</h1>
<hr/>
<h2>(1) goog.ui.Button</h2>
<div id="button1"></div>
<h2>(2) goog.ui.decorate</h2>
<div id="button2" class="goog-custom-button">
<span style="color: blue">BUTTON-<b>2</b></span>
</div>
<div id="button3" class="goog-custom-button">
<span style="font-size: 7pt">BUTTON-<b>3</b></span>
</div>
<script>
setupButtons();
</script>
</body>
</html>
goog.ui.CustomButton や decorate を使っている。Closure Library はとりあえず googleのサイトを参照している(コンパイル後に取り除く予定)。
JavaScriptファイル:js/button.js
goog.require('goog.ui.CustomButton');
goog.require('goog.ui.decorate');
function setupButtons() {
var btn1 = new goog.ui.CustomButton('BUTTON-1');
btn1.render(goog.dom.$('button1'));
goog.events.listen(btn1, goog.ui.Component.EventType.ACTION,
function(e) {
var target = e.target;
alert('button1: ' + target);
});
var btn2 = goog.ui.decorate(goog.dom.$('button2'));
goog.events.listen(btn2, goog.ui.Component.EventType.ACTION,
function(e) {
var target = e.target;
alert('button2: ' + target);
});
var btn3 = goog.ui.decorate(goog.dom.$('button3'));
}ボタンの定義を行っている。button-min.html の最後で setupButtons()が呼び出される。
実行するとこんな画面が出る。
コンパイル
やってみよう。
closure ライブラリは ~/Development/closure-tools/closure に、
closuer compiler は ~/Development/closure-tools/compiler にあるとする。
python ~/Development/closure-tools/closure/bin/calcdeps.py \
-i button.js \
-p ~/Development/closure-tools/closure \
-o compiled \
-c ~/Development/lib/closure-tools/compiler/compiler.jar \
-f "--comilation_level=ADVANCED_OPTIMIZATIONS" > button-min.js
calcdeps.py: Scanning files...
calcdeps.py: Finding Closure dependencies...
calcdeps.py: Compiling with the following command: java -jar /Users/hashi/Development/lib/closure-tools/compiler/compiler.jar --js /Users/hashi/Development/closure-tools/closure/go
:
:
.js --js /Users/hashi/Development/closure-tools/closure/goog/ui/custombutton.js --js button.js --compilation_level=ADVANCED_OPTIMIZATIONS
$数分後に button-min.js が生成された(PowerPCは今となっては非力でとても重い..)。
$ ls -l total 48 -rw-r--r-- 1 hashi hashi 19163 1 22 21:35 button-min.js -rw-r--r-- 1 hashi hashi 593 1 22 21:18 button.js
サイズが大きくなっているのは Closure Library を取り込んでいるため。
中身はこんな感じ。
これで元の JavaScriptを差し替えてみよう。
新バージョン
button-min.html を書き換える。
書き換え前: 6 <script src="http://closure-library.googlecode.com/svn/trunk/closure/goo g/base.js"></script> 7 <script src="/js/button.js"></script>これを下のようにする。
書き換え後: 6 <script src="/js/button-min.js"></script>
動かしてみよう。
ボタンがうまく表示されていない。問題があるようだ。
Safariのエラーログを見ると setupButtons()が見つけられないとのこと。
ドキュメントを見ると ADVANCED_OPTIMIZATIONS を付けた場合、呼び出しの無い関数は削除されてしまうとのこと。
Advanced Compilation and Externs - Closure Compiler - Google Code
setupButtons()の呼び出しは HTML内だけに記述してあって button.js には定義だけしか書いていない。コンパイラは button.js だけしか見ていないので使われていない関数と判断したようだ。
オプションから ADVANCED_OPTIMIZATIONS を外して再度コンパイルしてみる。
python ~/Development/closure-tools/closure/bin/calcdeps.py \
-i button.js \
-p ~/Development/closure-tools/closure \
-o compiled \
-c ~/Development/closure-tools/compiler/compiler.jar \
> button-min.js$ ls -l -rw-r--r-- 1 hashi hashi 133677 1 22 22:12 button-min.js -rw-r--r-- 1 hashi hashi 593 1 22 21:18 button.jsサイズはずいぶん大きくなった。さっきのが 19,163バイトだったので約7倍。
さて実行しなおしてみよう。
出た。
比較
コンパイル前とコンパイル後でどれだけ違うか比べてみた。サンプルは GAEにデプロイしてある。
コンパイル前
http://closuresample.appspot.com/html/button.html
コンパイル後
http://closuresample.appspot.com/html/button-min.html
結果はこの通り。※Safariの Webインスペクタで計測
コンパイル前
コンパイル後
JavaScriptの読み込み時間が8割近く短縮された。全体でも約1/3に短縮。体感速度も全然速い。
- - - -
Closure Compiler は使えそうだ。ただし開発中は未コンパイル状態なのでやっぱり遅いまま。開発効率にかかわるのでどうにか改善したいところだが。







0 件のコメント:
コメントを投稿