Google Closure中的变量

Mar*_*ark 2 javascript jquery minify google-closure

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);
});

})();
Run Code Online (Sandbox Code Playgroud)

像这样的代码缩小为:

(function(){this.each(function(){alert({method1:"somevar1",method2:"somevar2",method3:"somevar3",method4:"somevar4",method5:"somevar5"})})})();
Run Code Online (Sandbox Code Playgroud)

这个长度肯定比(+11个符号)更大:

(function(){var a="somevar";this.each(function(){alert({method1:a+"1",method2:a+"2",method3:a+"3",method4:a+"4",method5:a+"5"})})})();
Run Code Online (Sandbox Code Playgroud)

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

实际上它对于一个小脚本来说并不坏,但是对于一个大脚本可能会受到伤害.

添加第一个变量以使缩小的代码更小,但谷歌忽略它.

它也忽略了大多数像这样的其他大小优化技巧.

可以修复吗?

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

JJJ*_*JJJ 7

编译器假定文件在向用户提供时将被gzip压缩,因此它优化了压缩文件大小而不是未压缩大小.

我测试了两个版本的代码.

版本A(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);
    });
})();
Run Code Online (Sandbox Code Playgroud)

产生的缩小代码:

(function(){a="somevar";this.a(function(){alert({b:a+"1",c:a+"2",d:a+"3",e:a+"4",f:a+"5"})})})();
Run Code Online (Sandbox Code Playgroud)

大小:97字节(gzip压缩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);
    });
})(); 
Run Code Online (Sandbox Code Playgroud)

产生的缩小代码:

(function(){this.a(function(){alert({b:"somevar1",c:"somevar2",d:"somevar3",e:"somevar4",f:"somevar5"})})})();
Run Code Online (Sandbox Code Playgroud)

大小:110字节(gzip压缩89字节).


所以第二个版本是未压缩的更大版本,但是当它被gzip压缩时它变小了,因为变量声明消失了,gzip将重复部分压缩到大致相同的空间,而不管重复文本有多长.

以下是常见问题解答中的条目:

Closure Compiler内联我的所有字符串,这使我的代码大小更大.为什么这样做?

大多数人通过查看两个未压缩的JavaScript文件来比较代码大小.但这是一种误导性的查看代码大小的方法,因为您的JavaScript文件不应该是未压缩的.应该使用gzip压缩.

Closure Compiler假设您正在使用gzip压缩.如果你不这样做,你应该.配置服务器以gzip代码是您可能执行的最有效和最简单的优化之一.gzip算法通过尝试以最佳方式对字节序列进行别名来工作.手动别名字符串几乎总是使压缩的代码大小更大,因为它颠覆了gzip自己的别名算法.所以Closure Compiler会(几乎)总是内联你的字符串,因为这会使你的压缩代码更小.

  • 啊,这里是:*"Closure Compiler假设您正在使用gzip压缩."*https://code.google.com/p/closure-compiler/wiki/FAQ#Closure_Compiler_inlined_all_my_strings,_which_made_my_code_size (2认同)