Closure Libraryで遊ぶ

最初に読み込むもの

とりあえず開発中とか遊ぶ最中はscriptはgooglesvnから読み込むと楽だと思う。

<script src="http://closure-library.googlecode.com/svn/trunk/closure/goog/base.js"></script>

基本的に読み込む外部ファイルはこれだけでいい。

クリックイベントをボタンにつけてみる

なんか最近仕事ではすっかりjQueryばっかりなので

$('#btn').click(function() { alert('Click'); });

ぐらいのノリを期待するのだが、ここまで短くはなりません。

同じ事をClosure Libraryでやるにはこんな感じ。

goog.require('goog.dom');
goog.require('goog.events');

goog.events.listen(goog.dom.$('btn'), goog.events.EventType.CLICK, function(e) { alert('Click'); });

まあ、最初のrequireは置いておけばちょっと名前空間分長くなってしまったかなぐらいですよね。

スクリプトにする

最初にGoogleリポジトリから読み込むようにしましたが、このスクリプトを読み込むと他にも色々読み込まれています。Firebugとかで見ると、結構しゃれにならない数のスクリプトGoogleリポジトリから読み込まれてることがわかります。
おそらくこれのせいで、こんな単純な事しかやっていないHTMLが死ぬほど遅い。。

なので、とりあえずサーバーから読み込まなくていいように一つのスクリプトファイルにしましょう。

ライブラリごと持ってくる

スクリプトファイル化するにはClosure Libraryがまるごと必要です。厳密には知りませんが、てっとり早く全部取ってくる方が楽です。

適当なSubversionクライアントで以下のリポジトリを全部取ってきましょう。
http://closure-library.googlecode.com/svn/trunk/

公式ドキュメントはこちら:
http://code.google.com/intl/ja/closure/library/docs/gettingstarted.html

まずはJSを外部ファイルにする

先程のクリックイベントを記述した内容を外部JavaScriptファイルにします。ここではsample.jsとしましょう。

一応再度ファイルの内容を書いておくと。

goog.require('goog.dom');
goog.require('goog.events');

goog.events.listen(goog.dom.$('btn3'), goog.events.EventType.CLICK, function(e) {
	alert(this.value);
});

だけですね。

スクリプトファイルにする。

さて、後は実行するだけです。
今回はsample.script.jsという名前で出力するようにしています。

> python %Closure Libraryをチェックアウトしたフォルダ%\closure\bin\calcdeps.py -i .sample.js -p %Closure Libraryをチェックアウトしたフォルダ%\closure\goog -o script > sample.script.js

公式ドキュメントはこちら:
http://code.google.com/intl/ja/closure/library/docs/calcdeps.html

以下のようにコンソールに表示されればOKです。

calcdeps.py: Scanning files...
calcdeps.py: Finding Closure dependencies...
できてみたものの...

332KB、結構大きいですね。
それから今回できらスクリプトファイルはheadではなくて、bodyの最後の方で読み込まないと、イベントを付けるボタンが生成されていないためエラーになるので注意してください。

コンパイルしてみる

やっぱりClosure Libraryはコンパイルしてなんぼでしょうということでコンパイルしてみましょう。どれぐらい縮まるのか楽しみです。

今度はコンパイラをダウンロードしてきましょう。
http://closure-compiler.googlecode.com/files/compiler-latest.zip

さてコンパイラを解凍したらさっそく以下の感じで実行してみましょう。

> python %Closure Libraryをチェックアウトしたフォルダ%\closure\bin\calcdeps.py -i sample.js -p %Closure Libraryをチェックアウトしたフォルダ%\closure\goog -o compiled -c %ClosureCompilerを解凍したフォルダ%\compiler-latest\compiler.jar -f "--compilation_level=ADVANCED_OPTIMIZATIONS" > sample.compiled.js

ちょっと長いコンソールログが出ますが、「failed」ってでなければおそらく大丈夫です。

さて今回の大きさは

おお、18KB!!ホントに動くのって感じでしたが、普通に動きました。すごいですねこれは。まあ、YahooとかMSのもこれぐらい小さくしてくれるんだとは思いますが。

まとめ

全部英語なんですが、とにかくドキュメントは豊富だしけっこう見やすいですね。
名前空間書くのもjQueryに慣れてるとちょっと最初はめんどいなーと思うんですが、慣れてくるとJavaっぽくて個人的には好きだなーという印象ですかね。

けっこう会社のコードはjQueryだったりオレオレライブラリだったり、なんか適当なUIコンポーネントをみんなが適当に入れたりでカオスだったのでなんとかしたいなーと思ってましたが、Closure LibraryはUIコンポーネントもすごく豊富でいい感じですね。