Javascript压缩和对象属性问题

主要的
JavaScript压缩器和缩放器不处理对象属性名称. (Google Closure,YUI ……)

我注意到结果大小(gzip并且没有gzip)有很大差异,这取决于我们决定为脚本选择哪种方式或模式.

例如,为我们的项目选择原型模式很可能会生成更大的结果文件(未压缩,压缩和压缩).

这里有两个代码完全相同的代码:

> Prototype pattern 138字节gzipped(286字节未压缩)
> Without pattern 87字节gzipped(110字节未压缩)

使用Google Closure compiler压缩.

只需查看生成的压缩代码,结果非常明显:

原型模式

var MyBluePrint=function(){this.name=”demo”;this.someFunction=function(){alert(“some function”)};this.someOtherFunction=function(){alert(“some other function”)};this.showMyName=function(){alert(this.name)};this.someFunction();this.someOtherFunction();this.showMyName()};new MyBluePrint;

没有模式

var MyBluePrint=function(){alert(“some function”);alert(“some other function”);alert(“demo”)};new MyBluePrint;

使用对象属性的任何内容都不会被压缩.如:

//function declarations
this.someFunction = function(){ ... }

//objects
var demo = {
    isActive: 'aaaa'.
    name: 'aaaa'
}

在创建我们的项目时,我们应该真正考虑这个问题吗?
这不是第一次,而不是让对象充满属性我决定使用常规变量只是因为压缩长属性名被多次使用.

最佳答案 Closure-Compiler使用ADVANCED_OPTIMIZATIONS可以完全重命名属性名称.此外,为了获得Closure-compiler的全部功能,您需要告诉编译器MyBluePrint是使用@constructor注释的构造函数.而且,你所谓的“原型模式”实际上是使用实例方法 – 而不是原型.

这是更新的比较:

> Instance Methods – 104字节gzip
> Private Closures – 79字节gzipped
> Prototype Methods – 81字节gzip

在许多情况下,Closure编译器可以完全内联方法,使输出大小差异几乎可以忽略不计.如果可以使用带有ADVANCED_OPTIMIZATIONS的Closure编译器,则应选择提供最佳可维护性的代码模式,并让编译器处理优化.

然而,所有这些比较基本上都没有意义.要进行实际的GZIP压缩比较,您需要一个大的代码库.小代码片段不提供准确的表示.

点赞