2011-01-06 4 views
6

Google Closure Compiler benennt alle "true", "false" und "null" Vorkommnissen in Code wie;Wie verhindern Closure Compiler von Umbenennung "true", "false" und "null"

var s = true, x = null, V = false; 

und verwendet stattdessen diese shorthands; unter Bedingungen wie;

if (someVariable == s) 

jetzt; Google Analytics-Code definiert seine eigene Variable "s". Überschreiben des Wertes "wahr"; und wie Sie sehen können, verursacht dies eine Menge Probleme.

Ich möchte den GA-Code nicht ändern; Ich will nur, dass der Closure Compiler mit dem Umbenennen aufhört, usw. Externes funktioniert nicht.

Kennen Sie einen Weg, dies zu erreichen?

+0

Können Sie Ihre eigenen Konstanten zB '_true_ = true' angeben und dann durch diese ersetzen, bevor Sie den Closure Compiler ausführen? –

Antwort

11

Es stellt sich heraus, dass man verhindern kann, dass der Google Closure Compiler globale Definitionen (Funktion und/oder Variable) durch einen Parameter namens "output_wrapper" an den Befehlszeilencode ausgibt;

java -jar compiler.jar --compilation_level ADVANCED_OPTIMIZATIONS --output_wrapper "(function(){%output%})();" --js input.js --js_output_file output.js 

Auf diese Weise kollidiert es nicht mit globalen Variablen und druckt Ihren gesamten Code in einem anonymen Wrapper.

+0

Ich würde empfehlen, diese Methode über das Hinzufügen der anonymen Funktion in Ihrem vorverschleierten Code zu verwenden. Dies liegt daran, dass der Closure-Compiler die Werte true, false und null in den globalen Namespace einfügt, was zu Konflikten mit anderen JS führen kann. – eggsy84

1

Ihr Hauptproblem ist, dass Ihr Code läuft im globalen Bereich/Namensraum, das ist, warum die Dinge zum Absturz bringen.

es zu beheben, legt es in einem anonyme Funktion Wrapper:

(function() { 
    // a self contained "namespace" 
    var s = true; // won't be affected by the analytics code anymore  


    // expose something 
    window.foo = function() {}; 

})(); // execute the function immediately 

Dies ist das gemeinsame Idiom Auseinandersetzungen von Variablennamen usw. verhindern Wenn Sie die Dinge auch außerhalb der vornehmen müssen Wrapper, fügen Sie sie einfach als Eigenschaften zum Objekt window hinzu.

Sie verwirren mit Schließung nicht stören, wenn Sie Ihren Code ändern, es könnte die Variablen verschiedene Namen geben enden. Und was ist, wenn plötzlich mehr globale Variablen auf Ihrer Seite sind? All diese Probleme sind gute Gründe, Ihren Code immer in einen Wrapper wie den obigen zu stecken.

+0

Eigentlich benenne ich nichts um. Ich habe mehrere Dateien, die den CC (Closing Compiler) in einem einzigen Durchlauf durchlaufen; und alle Codes in jeder einzelnen Datei haben ihren eigenen Namespace mit der anonymen Funktion wrapper wie in Ihrem Beispiel. Es ist nur, CC "seltsam" benennt "wahr", "falsch" und "null" im globalen Namespace. Und ich kann die Art, wie CC agiert, nicht ändern. – dashersw

1

Es gibt eine Option in CompilerOptionsaliasKeywords genannt. Wenn der Wert auf false gesetzt ist, wird der Compiler nicht "true", "false" und "null" aliasieren.

+0

Das war, wonach ich gesucht habe. Für zukünftige Besucher, zum Glück dieser kontraproduktive Funktion wurde im Jahr 2015 entfernt [\ [1 \]] (https://github.com/google/closure-compiler/commit/813293c2bdf2fc230cac9371af92c5def4fb4514) [\ [2 \]] (https: //github.com/google/closure-compiler/commit/dd84f24179bb433d27176e555efa3b87782ae346) (Komprimieren von doppelten Symbolen ist das, wofür GZIP steht). –

Verwandte Themen