Personal tools
You are here: Home ブログ uchida Closure Libraryのi18n/datetimesymbols.jsのファイルサイズがでかい
« December 2010 »
Su Mo Tu We Th Fr Sa
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
Categories
JavaScript
Go
Ada
Delphi
junk
 
Document Actions

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 = {
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
};
externs/datetimesymbols.js
goog.require('goog.i18n.DateTimeSymbols_ja');
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);
これを利用してADVANCED_OPTIMIZATIONSでコンパイルします。
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 \
--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
これでdatetimepicker_compressed2.jsは182KBです。
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)

サンプルdatetimepicker.zip

こちらを参考にさせていただきました。
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
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.