我最近一直在檢查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 –