YUI Compressor壓縮JavaScript 的內容包括:
- 移除註釋
- 移除額外的空格
- 細微優化
- 標識符替換(Identifier Replacement)
YUI Compressor 包含哪些細微優化呢?
- object["property"] ,如果屬性名稱是合法的JavaScript 識別碼(註:合法的JavaScript 識別碼-由一個字母開頭,其後選擇性地加上一個或多個字母、數字或底線)且不是保留字,將最佳化為: object.property
- {"property":123} ,如果屬性名稱是合法的JavaScript 識別碼且不是保留字,將優化為{property:123} (註:在物件字面量中,如果屬性名稱是合法的JavaScript 識別碼且不是保留字,不強制要求用引號引住屬性名)。
- 'abcd'efgh',將優化為"abcd'efgh"。
- "abcd" + "efgh",如果是字串相連接,將優化成"abcdefgh"(註:所有在使用YUI Compressor 的前提下,對於腳本中的字串連接,使用連接符「+」 的效率和可維護性最高)。
對於JavaScript 最有效的壓縮最佳化,當屬識別碼替換。
比如:
(function(){
function add(num1, num2) {
return num1 + num2;
}
})();
進行屬標識符替換後:
(function(){
function A(C, B) {
return C+ B;
}
})();
再移除額外的空格,最後成了:
(function(){function A(C,B){return C+B;}})();
YUI Compressor 識別碼替換僅替換函數名和變數名,那哪些不能被取代呢?
- 原始值:字串、布林值、數字、null 和undefined。一般來說字串佔的空間最多,而非數字字面量其次(true、false,null,underfinded)。
- 全域變數:window、document、XMLHttpRequest等等。使用最多的就是document、window。
- 屬性名,例如:foo.bar。佔據的空間僅次於字串,”。” 操作符無法被代替,且abc 更加費空間。
- 關鍵字。常被過度使用的關鍵字有:var、return。最好的最佳化方法:一個函數只會出現一次var 和return 關鍵字。
對於原始值、全域變數、屬性名的最佳化處理方式大致相同:任何字面量值、全域變數或屬性名被使用超過2 次(包括2次),都應該用局部變數儲存取代。
但有部分情況下是禁止使用識別符替換的:
- 使用eval() 函數。解決方法:不使用或建立一個全域函數封裝eval()。
- 使用with 語句。解決方法:方法同上。
- JScript 的條件註解。唯一解決的方法:不使用。
由於YUI Compressor 是建立在rhino interpreter基礎上的,所以上述所有的優化都是安全的。
延伸閱讀:
《Extreme JavaScript Compression With YUI Compressor》
原文:
http://www.planabc.net/2009/08/02/javascript-compression_with_yui_compressor/