私は最近Google Closure Compilerをチェックアウトしています。私は.jarファイルをダウンロードし、テストドライブを与えました。これまでのところ、私は非常に感銘を受けたと言わなければなりません。私は最小限を超えてその有用性を確かに見ることができます。 Googleチームの小道具!GoogleクローズコンパイラのADVANCED_OPTIMIZATIONSオプション
私は1つの小さなグリップを持っています。最適化が行われる限り、2つの選択肢しか得られないようです。 SIMPLE_OPTIMIZATIONSまたはADVANCED_OPTIMIZATIONSのいずれかです。前者は、適切ではあるが、非常に単純なIMHOです。一つは、私が何かを逃していない限り、それはすべてのプロパティの名前を手つかずのままにします。到達不能なコードは削除されません。一方、後者の選択肢は単に破壊的すぎる。
今、私はJavaScriptをかなり新しくしているので、何かが欠けている可能性が非常に高いです。私が何か愚かなことを言うならば、学校に私を自由に感じてください。つまり、私はJavaScriptで名前を変更することで問題を理解することができます。 Googleチームは、ドット表記(object.property)ではなくブラケット表記(オブジェクト['property'])を使用して、変更したくないプロパティにアクセスし、2つの用途を混同しないようにすることをお勧めします。ただし、次の2つの表記をミックスしたい正当な場合がある
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 –