YUI Compressor壓縮JavaScript原理及微優(yōu)化
更新時(shí)間:2013年01月07日 14:16:40 作者:
最近寫一個(gè)jQuery插件,在最后完成優(yōu)化時(shí),對(duì)比發(fā)現(xiàn)壓縮后文件比較大,就思考那些是可以被修改和優(yōu)化的,發(fā)現(xiàn)壓縮原理也有很大的空間可以學(xué)習(xí)
最近寫一個(gè)jQuery插件,在最后完成優(yōu)化時(shí),對(duì)比發(fā)現(xiàn)壓縮后文件比較大,就思考那些是可以被修改和優(yōu)化的,發(fā)現(xiàn)壓縮原理也有很大的空間可以學(xué)習(xí),通過這次對(duì)YUI Compressor壓縮JavaScript深有體會(huì),那些是可以被壓縮的,特別是那些不能被壓縮的,都需要很清楚,這樣才能寫出來的插件才能保持文件更小,代碼更精巧,而且優(yōu)化的過程中也會(huì)發(fā)現(xiàn)代碼待改良的地方,對(duì)以后也有很大幫助。隨便在網(wǎng)上找來一篇文章做記錄了。
YUI Compressor 壓縮 JavaScript 的內(nèi)容包括:
移除注釋
移除額外的空格
細(xì)微優(yōu)化
標(biāo)識(shí)符替換(Identifier Replacement)
YUI Compressor包括哪些細(xì)微優(yōu)化呢?
object["property"] ,如果屬性名是合法的 JavaScript 標(biāo)識(shí)符(注:合法的 JavaScript 標(biāo)識(shí)符——由一個(gè)字母開頭,其后選擇性地加上一個(gè)或者多個(gè)字母、數(shù)字或下劃線)且不是保留字,將優(yōu)化為: object.property
{"property":123} ,如果屬性名是合法的 JavaScript 標(biāo)識(shí)符且不是保留字,將優(yōu)化為{property:123} (注:在對(duì)象字面量中,如果屬性名是一個(gè)合法的 JavaScript 標(biāo)識(shí)符且不是保留字,并不強(qiáng)制要求用引號(hào)引住屬性名)。
'abcd\'efgh',將優(yōu)化為 "abcd'efgh"。
"abcd" + "efgh",如果是字符串相連接,將優(yōu)化成 "abcdefgh"(注:所有在使用 YUI Compressor 的前提下,對(duì)于腳本中的字符串連接,使用連接符 “+” 的效率和可維護(hù)性最高)。
對(duì)于 JavaScript 最有效的壓縮優(yōu)化,當(dāng)屬標(biāo)識(shí)符替換。
比如:
(function(){
function add(num1, num2) {
return num1 + num2;
}
})();
進(jìn)行屬標(biāo)識(shí)符替換后:
(function(){
function A(C, B) {
return C+ B;
}
})();
再移除額外的空格,最終成了:
(function(){function A(C,B){return C+B;}})();
YUI Compressor 標(biāo)識(shí)符替換僅替換函數(shù)名和變量名,那哪些不能被替代呢?
原始值:字符串、布爾值、數(shù)字、null 和 undefined。一般來說字符串占的空間最多,而非數(shù)字字面量其次(true、false,null,underfinded)。
全局變量:window、document、XMLHttpRequest等等。使用最多的就是 document、window。
屬性名,比如:foo.bar。占據(jù)的空間僅次于字符串,”.” 操作符無法被代替,且 a.b.c 更加費(fèi)空間。
關(guān)鍵字。經(jīng)常被過度使用的關(guān)鍵字有:var、return。最好的優(yōu)化方法:一個(gè)函數(shù)僅出現(xiàn)一次 var 和 return 關(guān)鍵字。
對(duì)于原始值、全局變量、屬性名的優(yōu)化處理方式大致相同:任何字面量值、全局變量或者屬性名被使用超過 2 次(包括2次),都應(yīng)該用局部變量存儲(chǔ)代替。
但有部分情況下是禁止使用標(biāo)識(shí)符替換的:
使用 eval() 函數(shù)。解決方法:不使用或者創(chuàng)建一個(gè)全局函數(shù)封裝 eval()。
使用 with 語句。解決方法:方法同上。
JScript 的條件注釋。唯一解決的方法:不使用。
由于 YUI Compressor 是建立在 rhino interpreter 基礎(chǔ)上的,所以上述所有的優(yōu)化都是安全的。
YUI Compressor 壓縮 JavaScript 的內(nèi)容包括:
移除注釋
移除額外的空格
細(xì)微優(yōu)化
標(biāo)識(shí)符替換(Identifier Replacement)
YUI Compressor包括哪些細(xì)微優(yōu)化呢?
object["property"] ,如果屬性名是合法的 JavaScript 標(biāo)識(shí)符(注:合法的 JavaScript 標(biāo)識(shí)符——由一個(gè)字母開頭,其后選擇性地加上一個(gè)或者多個(gè)字母、數(shù)字或下劃線)且不是保留字,將優(yōu)化為: object.property
{"property":123} ,如果屬性名是合法的 JavaScript 標(biāo)識(shí)符且不是保留字,將優(yōu)化為{property:123} (注:在對(duì)象字面量中,如果屬性名是一個(gè)合法的 JavaScript 標(biāo)識(shí)符且不是保留字,并不強(qiáng)制要求用引號(hào)引住屬性名)。
'abcd\'efgh',將優(yōu)化為 "abcd'efgh"。
"abcd" + "efgh",如果是字符串相連接,將優(yōu)化成 "abcdefgh"(注:所有在使用 YUI Compressor 的前提下,對(duì)于腳本中的字符串連接,使用連接符 “+” 的效率和可維護(hù)性最高)。
對(duì)于 JavaScript 最有效的壓縮優(yōu)化,當(dāng)屬標(biāo)識(shí)符替換。
比如:
復(fù)制代碼 代碼如下:
(function(){
function add(num1, num2) {
return num1 + num2;
}
})();
進(jìn)行屬標(biāo)識(shí)符替換后:
復(fù)制代碼 代碼如下:
(function(){
function A(C, B) {
return C+ B;
}
})();
再移除額外的空格,最終成了:
復(fù)制代碼 代碼如下:
(function(){function A(C,B){return C+B;}})();
YUI Compressor 標(biāo)識(shí)符替換僅替換函數(shù)名和變量名,那哪些不能被替代呢?
原始值:字符串、布爾值、數(shù)字、null 和 undefined。一般來說字符串占的空間最多,而非數(shù)字字面量其次(true、false,null,underfinded)。
全局變量:window、document、XMLHttpRequest等等。使用最多的就是 document、window。
屬性名,比如:foo.bar。占據(jù)的空間僅次于字符串,”.” 操作符無法被代替,且 a.b.c 更加費(fèi)空間。
關(guān)鍵字。經(jīng)常被過度使用的關(guān)鍵字有:var、return。最好的優(yōu)化方法:一個(gè)函數(shù)僅出現(xiàn)一次 var 和 return 關(guān)鍵字。
對(duì)于原始值、全局變量、屬性名的優(yōu)化處理方式大致相同:任何字面量值、全局變量或者屬性名被使用超過 2 次(包括2次),都應(yīng)該用局部變量存儲(chǔ)代替。
但有部分情況下是禁止使用標(biāo)識(shí)符替換的:
使用 eval() 函數(shù)。解決方法:不使用或者創(chuàng)建一個(gè)全局函數(shù)封裝 eval()。
使用 with 語句。解決方法:方法同上。
JScript 的條件注釋。唯一解決的方法:不使用。
由于 YUI Compressor 是建立在 rhino interpreter 基礎(chǔ)上的,所以上述所有的優(yōu)化都是安全的。
您可能感興趣的文章:
- java壓縮多個(gè)文件并且返回流示例
- 使用java基礎(chǔ)類實(shí)現(xiàn)zip壓縮和zip解壓工具類分享
- java使用gzip實(shí)現(xiàn)文件解壓縮示例
- Java壓縮文件ZIP實(shí)例代碼
- Java 文件解壓縮實(shí)現(xiàn)代碼
- java生成壓縮文件示例代碼
- 使用GruntJS鏈接與壓縮多個(gè)JavaScript文件過程詳解
- Java中如何調(diào)用cmd壓縮文件
- Java 圖片壓縮實(shí)現(xiàn)思路及代碼
- 使用UglifyJS合并/壓縮JavaScript的方法
- JavaScript 代碼壓縮工具小結(jié)
- JavaScript(JS) 壓縮 / 混淆 / 格式化 批處理工具
- javascript實(shí)現(xiàn)的樣式表(CSS) 格式整理與壓縮
- 一款js和css代碼壓縮工具[附JAVA環(huán)境配置方法]
- Microsoft Ajax Minifier 壓縮javascript的方法
- 用于CSS代碼壓縮與格式化的javascript函數(shù)代碼
- JavaScript 在線壓縮和格式化收藏
- java字符串壓縮解壓示例
相關(guān)文章
詳解addEventListener的三個(gè)參數(shù)之useCapture
本文主要給大家介紹的是addEventListener的三個(gè)參數(shù)之中的useCapture參數(shù)的使用及示例分享,有需要的小伙伴參考下2015-03-03為body標(biāo)簽和document.body都添加點(diǎn)擊事件后僅Firefox彈出了兩次
為body標(biāo)簽和document.body都添加點(diǎn)擊事件后僅Firefox彈出了兩次,需要的朋友可以參考下。2011-04-04小程序api實(shí)現(xiàn)promise封裝過程解析
這篇文章主要介紹了小程序api實(shí)現(xiàn)promise封裝過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11實(shí)例解析package.json和最常見的scripts字段
日常開發(fā)中,現(xiàn)在的前端開發(fā)已經(jīng)被三大框架取代,其中最主流的不過vue和react,而開發(fā)這些項(xiàng)目的時(shí)候不得不接觸package.json這個(gè)文件,可你真的了解這個(gè)文件嗎?今天給大家聊聊package.json和最常見的scripts字段,感興趣的朋友一起看看吧2023-04-04JavaScript中的Map數(shù)據(jù)結(jié)構(gòu)詳解
這篇文章主要為大家介紹了JavaScript的Map數(shù)據(jù)結(jié)構(gòu),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01