2016-04-14 5 views
0

ich auf ein seltsames Verhalten von Google Schließung Compiler, ADVANCED Modus gestolpert, und ich kann keine Erklärung finden: es umbenennt Funktion resetTransform von CanvasRenderingContext2DCanvasRenderingContext2D resetTransform und Google Schließung Compiler

da das Problem in der Produktion arised Code ich kann hier nicht copy-paste, aber ich habe in der Lage, das Problem in einem Fall, hier https://www.dropbox.com/s/ic9l755dvgkkqv7/case.zip?dl=0

die in klaren problematischen Code-Schnipsel zu reproduzieren:

context.resetTransform() 
context.translate (0 , canvas.height) 

die mit dem Compiler-Ausgang entspricht:

c.a();c.translate(0,b.height); 

wenn ich mich nicht irre, sollte resetTransform seinen Namen behalten, da sie zu den anderen Mitgliedern des CanvasRenderingContext2D zum Beispiel passieren, nur zu übersetzen. der Browser kann die "a" -Funktion nicht finden und generiert "TypeError: ca ist keine Funktion"

"c" ist eigentlich eine Instanz von CanvasRenderingContext2D, in der Tat, wenn ich ca zu c.resetTransform, das Skript funktioniert perfekt.

was mache ich falsch?

hatten keine Hinweise über dieses Problem überall

derzeit die neueste Compiler-Version mit mir, heruntergeladen von: https://dl.google.com/closure-compiler/compiler-latest.zip

Java-Version 1.7.0_80 si, aber das Problem weiterhin besteht auch bei einer älteren

+0

BTW, sollten Sie dies wahrscheinlich als "Javascript" -Frage markieren, nicht "Java" (natürlich Closure-Compiler ist in Java geschrieben, aber Ihre Frage ist über Javascript). – owler

Antwort

1

resetTransform ist auf mozilla.org als experimental feature markiert, was erklärt, warum es in closure_compiler/externs/browser/html5.js noch nicht vorhanden ist. Closure-Compiler weiß daher nicht, diesen Namen nicht zu minimieren.

Wenn Sie build closure-compiler from source (es ist ziemlich einfach zu tun), dann könnte man zu html5.js etwas hinzufügen, wie

/** 
* @return {undefined} 
*/ 
CanvasRenderingContext2D.prototype.resetTransform = function() {}; 

und dann den Compiler wieder aufzubauen. IIRC, muss der Compiler für Änderungen an den externen Dateien neu erstellt werden, um irgendeinen Effekt zu haben.

Sie können auch ein Problem oder eine Pull-Anforderung unter https://github.com/google/closure-compiler/issues/ mit der hinzugefügten API senden.

Möglicherweise gibt es eine Möglichkeit, resetTransform aufzurufen, ohne dass es im erweiterten Kompilierungsmodus minimiert wird. Closure-Compiler wird Eigenschaften, auf die in eckigen Klammern zugegriffen wird, nicht verkleinern.

(/** Function */mycontext['resetTransform'])(); 

Ich habe nie versucht, aber ich denke, das funktionieren würde. Der genaue Ausdruck, um den Closing-Compiler mit der Syntax zufrieden zu stellen, könnte einige Feinabstimmungen erfordern.


The instructions for building closure-compiler sind ein wenig in dem Moment aufgeschraubt werden.Hier sind einige grundlegende Hinweise:

Holen Sie sich eine lokale Kopie des Verschluss-Compiler-Repository:

git clone https://github.com/google/closure-compiler.git 

Später können Sie Ihre Kopie aktualisieren, je nach Bedarf mit

git pull 

build mit

ant clean 
ant jar 

Überprüfen Sie die Version mit:

java -jar build/compiler.jar --version 
+1

Sie können auch einfach eine externe Datei mit der Definition lokal einfügen – John

+0

Oder senden Sie eine Pull-Anforderung an das Compiler-Projekt, um die Definition hinzuzufügen. –

+0

Das erklärt alles: Ich dachte, es würde obsolet werden (da ist doch Transform), aber nichts gefunden ... denn es war genau umgekehrt. Vielen Dank ! – dolomighty74

Verwandte Themen