今回の結論は、修正による不具合の有無を考慮しない場合は、良い結果になりました。
また 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 KB | 78.03 KB | 79.56 KB | 77.67 KB | 
| 圧縮 | 30.66 KB | 22.99 KB | 23.88 KB | 22.73 KB | 
| (1) - (2) | (1) - (3) | (1) - (4) | (2) - (3) | (2) - (4) | 未圧縮 | 58.54 KB | 57.02 KB | 58.91 KB | -1.53 KB | 0.37 KB | 
|---|---|---|---|---|---|
| 圧縮 | 7.67 KB | 6.78 KB | 7.93 KB | -0.89 KB | 0.26 KB | 
結果としては javascript(prototype.js) が使えて、ファイル圧縮(gzip, deflate) が使えないというブラウザはほとんど無いことと、一度 ステータスコード 200 (ファイルデータ有り) で取得したファイルは、変更しない場合で If-Modified-Since をブラウザが送ってくる限り ステータスコード 304 (ファイルデータ無し) で返すことを合わせて考えるのであれば、大規模なサイトであっても、あまり意味は無いということがわかりました。
しかし始めて訪れたサイトで javascript が少しでも早く実行されるというのは良いと思います。
それぞれ動作確認していません。それぞれオプションを吟味していません。ajaxmin は /H を付けていますので、内容が変化しています。change が善戦している理由には、警告や注意やエラーになる場合のある変更があるため、というのもあると思います。
読み込んでエラーにならないことを確認したブラウザは Firefox 3.6.3 です。
先頭のコメントは残しています。
今回の javascript を短くする方法は、下記になります。
- 前々回の修正を行う。
- 前回の修正を行う。
- eval の部分を考慮していないので、不具合が発生する場合が有ります。
- この例の場合の圧縮するツールの詳細
 SpiderMonkey
 jsparsenodetree
 php コマンド (5.2.13-pl0-gentoo)
 gzip コマンド (1.4)
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 件のコメント:
コメントを投稿