2010/08/11
Closure Libraryのi18n/datetimesymbols.jsのファイルサイズがでかい
各国語の日付の名称やフォーマットが入っているのですが、全部使う人は稀でしょう。
必要ない部分はClosure Compilerで消してほしいのですが、消すためにはcompilation_levelをADVANCED_OPTIMIZATIONSにしなければなりません。
これを使うためには色々制約があるため、とりあえず使えないものとします。
例えばこんなjsファイルがあったとします。
datetimepicker.js
goog.require('goog.ui.PopupDatePicker');これを通常レベルでコンパイルします。
function attach(el) {
var picker = new goog.ui.PopupDatePicker();
picker.render();
picker.attach(el);
}
python closure-library-read-only/closure/bin/calcdeps.py \
--input datetimepicker.js \
--path closure-library-read-only/closure/goog/ \
--output_mode compiled \
--compiler_jar compiler.jar \
--output_file datetimepicker_compressed.js
この時のdatetimepicker_compressed.jsは348KBです。
何とかdatetimesymbols.jsだけでももっと圧縮したいので、これだけADVANCED_OPTIMIZATIONSでコンパイルしてみました。
まずこんなファイルを用意しておきます。
externs/datetimesymbols_extern.js
goog.i18n.DateTimeSymbols_ja = {externs/datetimesymbols.js
ERAS: [],
ERANAMES: [],
NARROWMONTHS: [],
STANDALONENARROWMONTHS: [],
MONTHS: [],
STANDALONEMONTHS: [],
SHORTMONTHS: [],
STANDALONESHORTMONTHS: [],
WEEKDAYS: [],
STANDALONEWEEKDAYS: [],
SHORTWEEKDAYS: [],
STANDALONESHORTWEEKDAYS: [],
NARROWWEEKDAYS: [],
STANDALONENARROWWEEKDAYS: [],
SHORTQUARTERS: [],
QUARTERS: [],
AMPMS: [],
DATEFORMATS: [],
TIMEFORMATS: [],
AVAILABLEFORMATS: {'Md': '', 'MMMMd': '', 'MMMd': ''},
FIRSTDAYOFWEEK: 0,
WEEKENDRANGE: [],
FIRSTWEEKCUTOFFDAY: 0
};
goog.i18n.DateTimeSymbols_en = {
ERAS: [],
ERANAMES: [],
NARROWMONTHS: [],
STANDALONENARROWMONTHS: [],
MONTHS: [],
STANDALONEMONTHS: [],
SHORTMONTHS: [],
STANDALONESHORTMONTHS: [],
WEEKDAYS: [],
STANDALONEWEEKDAYS: [],
SHORTWEEKDAYS: [],
STANDALONESHORTWEEKDAYS: [],
NARROWWEEKDAYS: [],
STANDALONENARROWWEEKDAYS: [],
SHORTQUARTERS: [],
QUARTERS: [],
AMPMS: [],
DATEFORMATS: [],
TIMEFORMATS: [],
AVAILABLEFORMATS: {'Md': '', 'MMMMd': '', 'MMMd': ''},
FIRSTDAYOFWEEK: 0,
WEEKENDRANGE: [],
FIRSTWEEKCUTOFFDAY: 0
};
goog.require('goog.i18n.DateTimeSymbols_ja');これを利用してADVANCED_OPTIMIZATIONSでコンパイルします。
goog.require('goog.i18n.DateTimeSymbols_en');
goog.exportSymbol('goog.i18n.DateTimeSymbols_ja', goog.i18n.DateTimeSymbols_ja);
goog.exportSymbol('goog.i18n.DateTimeSymbols_en', goog.i18n.DateTimeSymbols_en);
java -jar compiler.jar \そして全体を通常コンパイル。
--compilation_level ADVANCED_OPTIMIZATIONS \
--js_output_file tmp/datetimesymbols.js \
--externs externs/datetimesymbols_extern.js \
--js closure-library-read-only/closure/goog/base.js \
--js closure-library-read-only/closure/goog/i18n/datetimesymbols.js \
--js externs/datetimesymbols.js \
--output_wrapper "goog.provide('goog.i18n.DateTimeSymbols');
(function(){%output%})();"
python closure-library-read-only/closure/bin/calcdeps.py \これでdatetimepicker_compressed2.jsは182KBです。
--input datetimepicker.js \
--exclude closure-library-read-only/closure/goog/i18n/datetimesymbols.js \
--path tmp/ \
--path closure-library-read-only/closure/goog/ \
--output_mode compiled \
--compiler_jar compiler.jar \
--output_file datetimepicker_compressed2.js
150KB(≒datetimesymbols.jsを単体で通常コンパイルしたサイズ)ほど削れました。
最近はcalcdeps.pyよりclosurebuilder.pyを使うよう推奨されているみたいですが、excludeがないなどの理由でcalcdeps.pyを使ってます。
ポイントは3つ。
- externs/datetimesymbols_extern.jsでプロパティ名の変更を回避する
- externs/datetimesymbols.jsのgoog.exportSymbolで、未使用の変数が削除されるのを回避する
-
output_wrapperでgoog.provideを追加することにより、calcdeps.pyがコンパイル前のdatetimesymbols.jsと同じ動きになる
- 改行が重要(xtermだったらCtrl+Enter)
こちらを参考にさせていただきました。
http://www.layer13.com/wp/2010/02/27/T06-40-09
http://www37.atwiki.jp/aias-closurecompiler/
- Category(s)
- JavaScript
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/uchida/closure-library306ei18n-datetimesymbols-js306e30d530a130a430eb30b530a4304b3044/tbping