-->

2010-04-14

javascript を短くしてみましょう 第3回

prototype.js を短くしてみましょう。

今回の結論は、修正による不具合の有無を考慮しない場合は、良い結果になりました。
また javascript を圧縮するツールはすでにあるので、そちらがお勧めです。
http://fnya.cocolog-nifty.com/blog/2007/08/yui_compressor__57c4.html
http://webos-goodies.jp/archives/51182388.html
http://dogmap.jp/2007/09/06/minify-javascript/
http://fnya.cocolog-nifty.com/blog/2009/10/microsoft-ajax-.html
http://aspnet.codeplex.com/releases/view/34488

prototype.min.js.2010-04-13.gz

original→ prototype.js
change  → prototype.min.js.2010-04-13.gz
yuicomp → yuicompressor-2.4.2 (java -jar yuicompressor-2.4.2.jar -o prototype.yuicompressor-2.4.2.js prototype.js)
ajaxmin → Microsoft Ajax Minifier 1.1 (ajaxmin.exe /H prototype.js -o prototype.ajaxmin.js)

 (1) original(2) change (3) yuicomp (4) ajaxmin
未圧縮 136.58 KB78.03 KB79.56 KB77.67 KB
圧縮 30.66 KB22.99 KB23.88 KB22.73 KB

 (1) - (2)(1) - (3)(1) - (4)(2) - (3)(2) - (4)
未圧縮 58.54 KB57.02 KB58.91 KB-1.53 KB0.37 KB
圧縮 7.67 KB6.78 KB7.93 KB-0.89 KB0.26 KB

結果としては javascript(prototype.js) が使えて、ファイル圧縮(gzip, deflate) が使えないというブラウザはほとんど無いことと、一度 ステータスコード 200 (ファイルデータ有り) で取得したファイルは、変更しない場合で If-Modified-Since をブラウザが送ってくる限り ステータスコード 304 (ファイルデータ無し) で返すことを合わせて考えるのであれば、大規模なサイトであっても、あまり意味は無いということがわかりました。
しかし始めて訪れたサイトで javascript が少しでも早く実行されるというのは良いと思います。
それぞれ動作確認していません。それぞれオプションを吟味していません。ajaxmin は /H を付けていますので、内容が変化しています。change が善戦している理由には、警告や注意やエラーになる場合のある変更があるため、というのもあると思います。

読み込んでエラーにならないことを確認したブラウザは Firefox 3.6.3 です。
先頭のコメントは残しています。

今回の javascript を短くする方法は、下記になります。

javascript を短くしてみましょう 第1回
javascript を短くしてみましょう 第2回
javascript を短くしてみましょう 第4回
javascript を短くしてみましょう 第5回

追記: jslint で prototype.js を通すテスト結果。
//============================
// Warning. 括弧が無い場合
var a=1; if(a==1) a=2;
// Warning. セミコロンの無い場合
var a=1; if(a==1) {a=2}
// OK
var a=1; if(a==1) {a=2;}

//============================
// Error. tryでセミコロンが無い場合
var a=1; switch(a){case 1:try{break}catch(e){}}
// Warning. if文を使える場合
var a=1; switch(a){case 1:try{break;}catch(e){}}

//============================
// Warning.
var a = new Date;
var a = new Array;
var a = new Array();
// OK.
var a = new Array(0);
var a = new Date();

//============================
// __iterator__, __proto__
// Error.
if (a.__proto__){}
// Warning.
if (a["__proto__"]){}

//============================
// Error.
return a=1;
// OK.
return (a=1);

//============================
// var では無いカンマ区切り
// Error.
a=1, b=2;
// OK. 意味同じはず。
a=1; b=2;

//============================
// Error.
a = void 0;
// OK.
a = undefined;

// OKでは無い。変更可能。
undefined = null;
a = undefined;

結果としては、無理でした。

0 件のコメント: