2011-01-06 10 views
6

Google Closure Compiler rinomina tutte le occorrenze "true", "false" e "null" in codice simile;Come impedire a Closure Compiler di rinominare "true", "false" e "null"

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

e utilizza invece queste stenografie; in condizioni come;

if (someVariable == s) 

ora; Il codice di Google Analytics definisce la sua "s" variabile; annullando il valore "true"; e come puoi vedere, questo causa molti problemi.

Non voglio modificare il codice GA; Voglio solo chiudere il compilatore per chiudere la rinomina ecc. Gli extern non funzionano.

Conosci qualche modo per realizzare questo?

+0

È possibile fornire le proprie costanti, ad esempio '_true_ = true' e quindi sostituirle con questi prima di eseguire il compilatore di chiusura? –

risposta

11

Si scopre che è possibile impedire a Google Closure Compiler di stampare definizioni globali (funzione e/o variabile) da un parametro chiamato "output_wrapper" al codice della riga di comando come;

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

In questo modo, non entra in collisione con le variabili globali e stampa tutto il codice in un wrapper di funzione anonimo.

+0

Si consiglia di utilizzare questo metodo per aggiungere la funzione anonima nel codice pre-offuscato. Questo perché il compilatore Closure inserisce i valori true, false e null nello spazio dei nomi globale che potrebbero causare conflitti con altri JS – eggsy84

1

Il problema principale qui è che il codice viene eseguito nello spazio globale/spazio dei nomi, ecco perché le cose si bloccano.

Per risolvere il problema, metterlo all'interno di un funzione anonima involucro:

(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 

Questo è il idioma comune per prevenire scontri di nomi di variabili, ecc Se avete bisogno di fare le cose a disposizione al di fuori della wrapper, aggiungili semplicemente come proprietà all'oggetto window.

Non preoccuparti di fare casini con la chiusura, quando cambi il tuo codice potrebbe finire per dare alle variabili nomi diversi. Inoltre cosa succede quando ci sono all'improvviso più variabili globali sulla tua pagina? Tutti questi problemi sono buoni motivi per inserire sempre il codice in un wrapper come sopra.

+0

In realtà, non rinominare nulla. Ho diversi file che eseguono il CC (compilatore di chiusura) in una sola esecuzione; e tutti i codici in ogni file separato hanno il proprio spazio dei nomi con il wrapper della funzione anonima come nell'esempio. È giusto, CC "stranamente" rinomina "true", "false" e "null" nello spazio dei nomi globale. E non posso cambiare il modo in cui agisce CC. – dashersw

1

C'è un'opzione in CompilerOptions denominata aliasKeywords. Se impostato su false, il compilatore non eseguirà l'alias "true", "false" e "null".

+0

Questo era quello che stavo cercando. Per i futuri visitatori, fortunatamente questa funzione controproduttiva è stata rimossa nel 2015 [\ [1 \]] (https://github.com/google/closure-compiler/commit/813293c2bdf2fc230cac9371af92c5def4fb4514) [\ [2 \]] (https: //github.com/google/closure-compiler/commit/dd84f24179bb433d27176e555efa3b87782ae346) (la compressione dei simboli duplicati è a cosa serve GZIP). –

Problemi correlati