2013-02-16 3 views
52

Ich habe ein langes Skript, das nicht von mir geschrieben wurde. Wenn ich es laufen erhalte ich:Weitere Informationen von Phantomjs "SyntaxError: Parse Fehler" Nachricht

phantomjs file.js 
SyntaxError: Parse error 

überprüfte ich die manuelle und --help und die besten, die ich mit kam könnte war:

phantomjs --debug=yes file.js 
(irrelevant debug statement from CookieJar) 
SyntaxError: Parse error 

Gibt es einen besseren Weg, zumindest zu erhalten eine Zeilennummer? oder irgendeinen Hinweis überhaupt?

Antwort

81

Führen Sie die Datei mit Knoten verwenden. Wenn ein Parse-Fehler vorliegt, wird dies gemeldet.

Wenn die Datei gültig ist, dann Knoten wird auch versuchen, es zu laufen, was wird scheitern, wenn Ihr Skript auf etwas, das nicht in Ihrer Knoten Umgebung abhängt. Sie müssen also alle Laufzeitfehler ignorieren.

Zum Beispiel gegeben hallo-world.js:

// Say Hello World twice 
for (var i=0; i<2; i++) { 
    console.log("Hello World")); 
} 

Run mit Knoten:

node hello-world.js 

Ausgang:

/home/someone/somewhere/hello-world.js:3 
    console.log("Hello World")); 
          ^
SyntaxError: Unexpected token) 
    at Module._compile (module.js:439:25) 
    at Object.Module._extensions..js (module.js:474:10) 
    at Module.load (module.js:356:32) 
    at Function.Module._load (module.js:312:12) 
    at Function.Module.runMain (module.js:497:10) 
    at startup (node.js:119:16) 
    at node.js:901:3 
+0

Dies ist eine schnelle und clevere Möglichkeit, lokale Syntaxprüfung für js-Dateien auszuführen. Ich finde das viel schneller als die Online-Tools, und es ist nicht meinunglich. der Nachteil ist Knoten, aber ich vermute, dass die meisten Phantomjs Entwickler Knoten installiert haben. – danmux

+0

Was passiert, wenn ein Knoten auf ein globales Fenster trifft? Oder wenn Phantom, das läuft .. Chrom? ist eine andere Version als Node? Es ist ok für einige grundlegende Fälle, die ich –

+0

mein Rezept auf allen makefiles denke: 'find src/js/-name \ * js -exec knoten \ {\} \; 2> & 1 | grep -B 5 SyntaxError || exit 0 && exit 1; 'es wird fehlschlagen Machen Sie eine Regel, wenn es einen Syntaxfehler gibt und zeigen Sie die Zeile an, wo es passiert. – gcb

12

Ihr file.js enthält eine ungültige Syntax. Sie sollten es mit einem Syntax-Validator überprüfen. Ein Online-Tool, das ich erstellt habe, kann eine mögliche Lösung sein, check out http://esprima.org/demo/validate.html.

+0

diese eine Annahme (es war die erste Überprüfung Syntax an anderer Stelle vorschlagen), da es offensichtlich ist, dass PhantomJS keine Möglichkeit, an der Syntaxfehler andeuten hat von selbst. – gcb

2

Sie können auch Syntax-Linters wie JSLint oder jshint

+1

Ein Linter macht mehr als Syntaxvalidierung. In vielen Fällen ist es etwas eigenwilliger. –

+0

Ich versuchte Jslint und ja, es war zu eigensinnig und verließ den Code nach einigen 100 beschwert sich über meine Wahl des Stils (dh 'Funktion (var) {') oder Leerzeichen Verwendung, oder etwas anderes als frivol ... bis zur Zeit habe alle Einstellungen gefunden, um es vernünftig zu machen, ich hatte bereits den Syntaxfehler gefunden. :/werde jshint das nächste Mal versuchen! – gcb

11

Erste Weitere Informationen Fro m PhantomJS

Die nächste Version von PhantomJS (vermutlich wird es 1.9.8 sein, was auch immer kommt nach 1.9.7) ausgibt Fehler wie folgt aus:

SyntaxError: Parse error 
http://localhost:9000/scripts/49e8b4f4.vendor.js:8 

Also das ist etwas nützlicher als die aktuelle Nachricht .

Leider gibt es keine nächtlichen Builds für PhantomJS, daher müssen Sie zu diesem Zeitpunkt Ihre eigene Version des Masters kompilieren, wenn Sie dies versuchen möchten.

Debuggen minimierte Dateien

Wenn Sie mit einer verkleinerten Datei arbeiten, oft die Zeilennummer wird nicht sehr hilfreich sein, und das Debuggen oft die un-minimierte Datei sollten Sie die Parser-Fehler geben.

Um dies zu lösen, sobald Sie PhantomJS erhalten Sie den Namen der Datei zu geben, können Sie die online demo of Esprima verwenden können, eine tatsächliche Parse Ihrer JavaScript-Code zu erhalten:

http://esprima.org/demo/parse.html

Vom können Sie Geben Sie strategische Zeilenumbrüche ein, um den tatsächlichen Fehler zu isolieren.

Lint Werkzeuge sind Suboptimale für diesen Anwendungsfall

Ein lint Tool wie JSLint oder jshint sind meinungs als ein echter Parser, also, wenn Sie für einen ganz bestimmten Syntax-Fehler suchen, würde ich empfehlen, einen echten Parser zu verwenden, da nur die Gültigkeit des Codes überprüft wird, und nicht die Richtlinien für das Styling. Ich unterstelle nicht, dass Flusenwerkzeuge keinen Wert haben, nur dass sie für die Lösung dieser Art von Problemen nicht so hilfreich sind.

+1

1.9.8 hat immernoch nur Syntaxfehler :: und im neuen 2.0 Skript hängen sie zufällig, also nur Strg + Z;) – user956584

1

Ich erhielt SyntaxError: Parse error beim Versuch, require eine benutzerdefinierte minified jQuery.

Ich fand die Lösung war zu fügen Sie eine leere Zeile auf der Unterseite jquery.min.js.

Hoffentlich hilft das jemand. Verwenden von PhantomJS 1.9.7.

0

Ich verwende ein einfaches Shell-Skript, das Phantom normal ausführt, wenn keine Parse-Fehler gefunden werden, sonst werden die Fehler angezeigt. Es führt das Skript über den Knoten aus, sucht in der Ausgabe nach SyntaxError und führt den Knoten dann erneut zum Terminal aus, wenn Fehler vorliegen. Es übergibt alle Befehlszeilenargumente an Phantom.

Fehlermodus für diese Methode ist, wenn sich Ihr Knotenparser erheblich von Ihrem Phantomparser unterscheidet. Meine sind nah genug, dass es nie ein Problem war.

Nutzung: ./debug.sh --myArg1 val1 --myArg2 val2

debug.sh:

ERROR=$(node myscript.js 2>&1 >/dev/null | grep "SyntaxError") 

if [ "$ERROR" = "" ]; then 
    echo "No parse errors, running script..." 
    # run the script with Phantom and pass all the args to it 
    phantomjs accession.js $* 
else 
    echo "*********************************************************" 
    echo "********* There are parse errors in the script: *********" 
    echo "*********************************************************" 
    # show the errors by running again but not redirecting 
    node accession.js 
fi