1

Ich kompiliere meinen Code mit dem Google Closure-Compiler.Fehler beim Kompilieren von Code mit Google Closure Compiler

Der Code, den ich kompiliere, ist die relevanten Teile aus der Closure-Library, Hammer, Hammer-Time und etwas von meinem eigenen Code.

Die Zusammenstellung funktioniert, bis ich Hammer der Zusammenstellung hinzuzufügen, zu welchem ​​Zeitpunkt, als ich meine JavaScript laufen bekomme ich folgende Fehlermeldung:

Uncaught TypeError: n.add is not a function 

, die sich bezieht:

function mb(a, c, e, l, f, k) { 
    if (!c) 
     throw Error("Invalid event type"); 
    var h = !!f 
     , n = nb(a); 
    n || (a[ib] = n = new V(a)); 
    e = n.add(c, e, l, f, k); 
    if (!e.b) { 
     l = Jb(); 
     e.b = l; 
     l.src = a; 
     l.listener = e; 
     if (a.addEventListener) 
      a.addEventListener(c.toString(), l, h); 
     else if (a.attachEvent) 
      a.attachEvent(Kb(c.toString()), l); 
     else 
      throw Error("addEventListener and attachEvent are unavailable."); 
     kb++ 
    } 
} 

Wenn ich umbenennen die add Funktion in Hammer Ich bekomme dieses Problem nicht, aber ich fragte mich, ob es eine Alternative dazu gab?

Der vollständige Schließung Compiler Befehl lautet:

Antwort

1

Hammer.js mit JSDoc Kommentare geschrieben wird, die zu schließen sind, aber nicht vollständig kompatibel mit den Kommentaren, die von Google Closure Compiler. Ich schätze, das ist die Quelle Ihres Fehlers, aber es würde mehr Debugging benötigen, um sicher zu gehen. Sehen Sie diese Seite über Debugging Compiled Code, wenn Sie immer noch versuchen möchten, Hammer.js zusammen mit Ihrem Code zu kompilieren. Ich vermute, dass Sie den Hammer.js-Code etwas ändern müssen, damit es mit Closure Compiler funktioniert.

Die andere Option besteht darin, eine "externe" Datei zu erstellen, die Closure Compiler die API für Hammer mitteilt. Nachdem Sie Ihren Code mit Closure Compiler kompiliert haben, bleiben die Aufrufe von Hammer unbeeinträchtigt und Sie laden Hammer (die bereits reduzierte Version auf der Hammer-Website) auf der Ziel-HTML-Seite, bevor Sie Ihren Code laden. Siehe How do I write an externs file?.

Ein Beispiel für die Unterschiede der Doku-Kommentare zwischen JSDoc und Closure Compiler ist: JSDoc verwendet @param {Number}, während Closure Compiler dies als Referenz auf einen Wrapper-Typ und @param {number} für den primitiven Zahlentyp verwendet.