zl程序教程

您现在的位置是:首页 >  前端

当前栏目

YUICompressor压缩JavaScript原理及微优化

JavaScript原理 优化 压缩 yuicompressor
2023-06-13 09:14:43 时间
最近写一个jQuery插件,在最后完成优化时,对比发现压缩后文件比较大,就思考那些是可以被修改和优化的,发现压缩原理也有很大的空间可以学习,通过这次对YUICompressor压缩JavaScript深有体会,那些是可以被压缩的,特别是那些不能被压缩的,都需要很清楚,这样才能写出来的插件才能保持文件更小,代码更精巧,而且优化的过程中也会发现代码待改良的地方,对以后也有很大帮助。随便在网上找来一篇文章做记录了。

YUICompressor压缩JavaScript的内容包括
移除注释
移除额外的空格
细微优化
标识符替换(IdentifierReplacement)

YUICompressor包括哪些细微优化呢?
object["property"],如果属性名是合法的JavaScript标识符(注:合法的JavaScript标识符——由一个字母开头,其后选择性地加上一个或者多个字母、数字或下划线)且不是保留字,将优化为:object.property
{"property":123},如果属性名是合法的JavaScript标识符且不是保留字,将优化为{property:123}(注:在对象字面量中,如果属性名是一个合法的JavaScript标识符且不是保留字,并不强制要求用引号引住属性名)。
"abcd\"efgh",将优化为"abcd"efgh"。
"abcd"+"efgh",如果是字符串相连接,将优化成"abcdefgh"(注:所有在使用YUICompressor的前提下,对于脚本中的字符串连接,使用连接符“+”的效率和可维护性最高)。
对于JavaScript最有效的压缩优化,当属标识符替换。
比如:
复制代码代码如下:

(function(){
functionadd(num1,num2){
returnnum1+num2;
}
})();

进行属标识符替换后:
复制代码代码如下:

(function(){
functionA(C,B){
returnC+B;
}
})();

再移除额外的空格,最终成了:
复制代码代码如下:
(function(){functionA(C,B){returnC+B;}})();

YUICompressor标识符替换仅替换函数名和变量名,那哪些不能被替代呢?
原始值:字符串、布尔值、数字、null和undefined。一般来说字符串占的空间最多,而非数字字面量其次(true、false,null,underfinded)。
全局变量:window、document、XMLHttpRequest等等。使用最多的就是document、window。
属性名,比如:foo.bar。占据的空间仅次于字符串,”.”操作符无法被代替,且a.b.c更加费空间。
关键字。经常被过度使用的关键字有:var、return。最好的优化方法:一个函数仅出现一次var和return关键字。
对于原始值、全局变量、属性名的优化处理方式大致相同:任何字面量值、全局变量或者属性名被使用超过2次(包括2次),都应该用局部变量存储代替。
但有部分情况下是禁止使用标识符替换的:
使用eval()函数。解决方法:不使用或者创建一个全局函数封装eval()。
使用with语句。解决方法:方法同上。
JScript的条件注释。唯一解决的方法:不使用。
由于YUICompressor是建立在rhinointerpreter基础上的,所以上述所有的优化都是安全的。