Javascript 压缩和对象属性问题
Javascript compression and the object properties issue
主要的 JavaScript 压缩器和压缩器不处理对象属性名称。 (Google 关闭,YUI...)
我注意到结果大小(gzipped 和不 gzipped)有很大差异,具体取决于我们决定为脚本选择的方式或模式。
例如,为我们的项目选择原型模式很可能会生成更大的结果文件(未压缩、压缩和 gzip 压缩)。
下面是两个完全相同的代码的比较:
- Prototype pattern138 字节 gzipped(286 字节未压缩)
- Without pattern 87 字节 gzipped(110 字节未压缩)
只要看一下生成的压缩代码,结果就很明显了:
原型图案
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
注释的构造函数。另外,你所说的 "prototype pattern" 实际上是使用实例方法 - 而不是原型。
这是更新的比较:
- Instance Methods - 104 字节 gzipped
- Private Closures - 79 字节 gzipped
- Prototype Methods - 81 字节 gzipped
闭包编译器在许多情况下可以完全内联方法,使得输出大小差异几乎可以忽略不计。如果您可以将 Closure-compiler 与 ADVANCED_OPTIMIZATIONS
一起使用,您应该选择提供最佳可维护性的代码模式,并让编译器处理优化。
然而这些比较基本上都是没有意义的。要进行实际的 GZIP 压缩比较,您需要一个大型代码库。一小段代码无法提供准确的表示。
主要的 JavaScript 压缩器和压缩器不处理对象属性名称。 (Google 关闭,YUI...)
我注意到结果大小(gzipped 和不 gzipped)有很大差异,具体取决于我们决定为脚本选择的方式或模式。
例如,为我们的项目选择原型模式很可能会生成更大的结果文件(未压缩、压缩和 gzip 压缩)。
下面是两个完全相同的代码的比较:
- Prototype pattern138 字节 gzipped(286 字节未压缩)
- Without pattern 87 字节 gzipped(110 字节未压缩)
只要看一下生成的压缩代码,结果就很明显了:
原型图案
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
注释的构造函数。另外,你所说的 "prototype pattern" 实际上是使用实例方法 - 而不是原型。
这是更新的比较:
- Instance Methods - 104 字节 gzipped
- Private Closures - 79 字节 gzipped
- Prototype Methods - 81 字节 gzipped
闭包编译器在许多情况下可以完全内联方法,使得输出大小差异几乎可以忽略不计。如果您可以将 Closure-compiler 与 ADVANCED_OPTIMIZATIONS
一起使用,您应该选择提供最佳可维护性的代码模式,并让编译器处理优化。
然而这些比较基本上都是没有意义的。要进行实际的 GZIP 压缩比较,您需要一个大型代码库。一小段代码无法提供准确的表示。