我最近一直在检查Google Closure编译器。我下载了.jar文件,并给它一个测试驱动器。到目前为止,我必须说我对此印象非常深刻。我当然可以看到它的用处超越最小化。道具给Google团队!Google Closure编译器的ADVANCED_OPTIMIZATIONS选项
虽然我确实有一个小抱怨。在我看来,就优化而言,您只能得到两个选项。它可以是SIMPLE_OPTIMIZATIONS或ADVANCED_OPTIMIZATIONS。前者虽然足够,但是非常简单,恕我直言。首先,除非我遗漏了某些东西,否则它将保留所有的属性名称。它也不会删除无法访问的代码。另一方面,后一种选择太破坏性了。
现在,我相当新的JavaScript,所以很可能我错过了一些东西。如果我说一些愚蠢的话,请随时上学。这就是说,我可以理解JavaScript中重命名的问题。 Google团队建议使用括号表示法(object ['property'])而不是点符号(object.property)来访问您不想更改的属性,并且不要混合这两种用法。他们还建议使用以下模式的“导出”方法:
MyClass = function(name) {
this.myName = name;
};
MyClass.prototype.myMethod = function() {
alert(this.myName);
};
window['MyClass'] = MyClass; // <-- Constructor
MyClass.prototype['myMethod'] = MyClass.prototype.myMethod;
但是,有些合法案例需要混合两种表示法。假设我们正在制作一款游戏。游戏的代码在关闭中完全隔离。它不会将任何东西“出口”到全球范围,也不需要。实际上,它确实不应该碰到窗口对象。不过,它确实需要从XML配置文件读取一些游戏中的属性。
示例JavaScript:
var TheGreatAdventure = (function(window) {
function Fighter() {
// Private to application
this.id = 42;
// Accessible to XML configuration system
this.name = 'Generic Jen';
this.hitPoints = 100;
this.onAttack = genericFighterAttack;
this.onSpeak = genericFighterSpeak;
...
}
Fighter.publishedProperties = ['name', 'hitPoints', 'onAttack', 'onSpeak']
function genericFighterAttack() {...}
function genericFighterSpeak() {...}
function cassieAttack() {...}
function cassieSpeak() {...}
...
EntityReader = {
...
function readFromXMLNode(attributes, entityClass, entityInstance) {
for (var i = 0; i < attributes.length; i++) {
var attribute = attributes[i];
if (attribute.nodeName in entityClass.publishedProperties)
entityInstance[attribute.nodeName] = bindContext[attribute.value];
}
}
...
}
}(window));
示例XML配置文件:
<Fighter name='Custom Cassie' onAttack='cassieAttack' onSpeak='cassieSpeak'/>
将不仅上述系统不能分配的属性,则所述功能cassieAttack和cassieSpeak会被最小化期间作为消除死码!
现在,我无法在整个游戏代码中使用括号表示法访问所有'已发布'属性。即使这样做没有运行时间的损失(应该没有),但仍然有很多额外的输入参与,并且它是(IMO)的眼中钉。有了这些共同的属性,所有东西都会在文本编辑器中显示为一个字符串,从而破坏了语法高亮的目的!
在我看来,一个简单的@preserve(或类似的东西)指令对这些特性将允许ADVANCED_OPTIMIZATIONS与最终方案规模最小的成本来使用。我错过了什么吗?
我有一个类似问题的答案:http://stackoverflow.com/questions/7823811/prevent-google-closure-compiler-from-renaming-settings-objects/7834912#7834912 –