http://closure-compiler.appspot.com/home

(function(){

var somevar = 'somevar';

this.each(function(){
var minify_var = {
  method1: somevar + '1',
  method2: somevar + '2',
  method3: somevar + '3',
  method4: somevar + '4',
  method5: somevar + '5'
};

alert(minify_var);
});

})();

这样的代码最小化为:
(function(){this.each(function(){alert({method1:"somevar1",method2:"somevar2",method3:"somevar3",method4:"somevar4",method5:"somevar5"})})})();

它的长度(+11个符号)肯定大于:
(function(){var a="somevar";this.each(function(){alert({method1:a+"1",method2:a+"2",method3:a+"3",method4:a+"4",method5:a+"5"})})})();

问题是,我们有两个变量,但只有一个。

实际上,对于小的脚本来说这还不错,但是对于大型脚本却可能会造成伤害。

添加了第一个变量以使缩小的代码更小一些,但Google忽略了它。

它还忽略了其他大多数此类大小优化技巧。

可以解决吗?

这个问题是关于Google Closure,而不是JavaScript模式。

最佳答案

编译器假定将文件提供给用户时会将其压缩,因此它针对压缩文件大小(而不是未压缩大小)进行优化。
我测试了两个版本的代码。
版本(将a处理为全局变量可防止以后自动将其串联):

(function () {
    a = 'somevar';

    this.each(function () {
        var minify_var = {
            method1: a + '1',
            method2: a + '2',
            method3: a + '3',
            method4: a + '4',
            method5: a + '5'
        };

        alert(minify_var);
    });
})();
产生的缩小代码:
(function(){a="somevar";this.a(function(){alert({b:a+"1",c:a+"2",d:a+"3",e:a+"4",f:a+"5"})})})();
大小:97个字节(已压缩 95 字节)。
版本B (与上面相同,但是a是局部变量,因此编译器会对其进行优化):
(function () {
    var a = 'somevar';

    this.each(function () {
        var minify_var = {
            method1: a + '1',
            method2: a + '2',
            method3: a + '3',
            method4: a + '4',
            method5: a + '5'
        };

        alert(minify_var);
    });
})();
产生的缩小代码:
(function(){this.a(function(){alert({b:"somevar1",c:"somevar2",d:"somevar3",e:"somevar4",f:"somevar5"})})})();
大小:110个字节(已压缩 89个字节)。

因此,第二个版本未压缩时较大,但是压缩时较小,而较小,因为变量声明消失了,并且gzip将重复部分压缩到大致相同的空间,而不管重复文本有多长。
这是FAQ的条目:

关于javascript - Google Closure中的变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15848174/

10-09 17:01
查看更多