本文深入解析YUI Compressor压缩JavaScript的核心机制,重点探讨标识符替换、注释与空格移除及字符串优化等微优化策略。通过具体代码示例,说明如何安全地替换变量名以减小文件体积,并列举eval、with等禁止替换的场景,帮助开发者编写更精简高效的JS代码。
YUI Compressor压缩JavaScript原理及微优化
在开发jQuery插件并进行最终优化时,若发现压缩后的文件体积依然较大,便需深入思考可优化的空间。了解YUI Compressor的压缩原理至关重要,明确哪些内容可以被压缩、哪些不能,有助于编写更小巧精悍的代码。这一优化过程不仅能减小文件体积,还能暴露代码中待改进之处,对后续开发大有裨益。
YUI Compressor压缩JavaScript的内容包括:
YUI Compressor压缩JavaScript的内容包括
移除注释
移除额外的空格
细微优化
标识符替换(Identifier Replacement)
YUI Compressor包括哪些细微优化呢?
YUI Compressor包括哪些细微优化呢?
当使用object["property"]形式访问属性,且该属性名是合法的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标识符替换仅替换函数名和变量名,那么哪些内容不能被替代呢?
YUI Compressor标识符替换仅替换函数名和变量名,那哪些不能被替代呢?
原始值包括:字符串、布尔值、数字、null和undefined。通常字符串占用空间最大,非数字字面量次之(如true、false、null、undefined)。
全局变量包括:window、document、XMLHttpRequest等。其中使用频率最高的是document和window。
属性名(如foo.bar)占据的空间仅次于字符串。“.”操作符无法被替代,且a.b.c的形式更加耗费空间。
关键字方面,var和return常被过度使用。最佳优化方法是:一个函数内仅出现一次var和return关键字。
对于原始值、全局变量和属性名的优化处理方式大致相同:任何字面量值、全局变量或属性名若被使用超过2次(包括2次),都应使用局部变量存储来代替。
但在部分情况下,禁止使用标识符替换:
使用eval()函数。解决方法:不使用该函数,或创建一个全局函数来封装eval()。
使用with语句。解决方法同上。
JScript的条件注释。唯一解决方法:不使用。
由于YUI Compressor基于rhino interpreter构建,因此上述所有优化都是安全的。