55 votes

obtenir plus d'informations à partir du message "SyntaxError" de phantomjs : Erreur de syntaxe".

J'ai un long script qui n'a pas été écrit par moi. Quand je l'exécute, j'obtiens :

phantomjs file.js
SyntaxError: Parse error

J'ai vérifié le manuel et l'aide, et le mieux que j'ai pu trouver est.. :

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

Y a-t-il un meilleur moyen d'obtenir au moins un numéro de ligne ? ou un indice quelconque ?

0 votes

FYI : Si vous utilisez la syntaxe de la grande flèche pour les lambdas (i.e. => ) votre script échouera et vous n'obtiendrez aucune erreur d'analyseur syntaxique en retour.

0 votes

Cette question reçoit des votes/réponses/commentaires et elle date d'une époque où l'on ne rêvait même pas encore de la syntaxe lambda en javascript ! ...les gens utilisent simplement firefox headless ! phantomjs est abandonné (et chrome/ium est mort pour moi)

82voto

Philip Dorrell Points 446

Exécutez le fichier avec nœud . S'il y a une erreur d'analyse, il la signalera.

Si le fichier est valide, alors nœud essaiera également de l'exécuter, ce qui échouera si votre script dépend de quelque chose qui n'est pas disponible dans votre nœud l'environnement. Vous devrez donc ignorer toute erreur d'exécution.

Par exemple, étant donné hello-world.js :

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

Exécutez-le avec nœud :

node hello-world.js

Sortie :

/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 votes

Il s'agit d'un moyen rapide et astucieux d'effectuer un contrôle syntaxique local sur les fichiers js. Je trouve que c'est beaucoup plus rapide que les outils en ligne, et en plus c'est sans opinion. L'inconvénient est qu'il faut avoir node, mais je pense que la plupart des développeurs de phantomjs ont node installé.

0 votes

Que se passe-t-il si le nœud rencontre une fenêtre globale ? Ou si phantom, qui fonctionne chromium ? est une version différente de Node ? C'est correct pour certains cas de base, je suppose.

0 votes

Ma recette sur tous les makefiles : find src/js/ -name \*js -exec node \{\} \; 2>&1 | grep -B 5 SyntaxError || exit 0 && exit 1; il échouera la règle Make rule s'il y a une erreur de syntaxe et vous montrera la ligne où cela se produit.

12voto

Ariya Hidayat Points 6765

Votre file.js contient une syntaxe invalide. Vous devez la vérifier avec un validateur de syntaxe. Un outil en ligne que j'ai créé peut être une solution, consultez le site suivant http://esprima.org/demo/validate.html .

0 votes

J'accepte cette proposition (c'était la première à suggérer de vérifier la syntaxe ailleurs) car il est évident que phantomjs n'a aucun moyen d'indiquer l'erreur de syntaxe par lui-même.

10voto

JBCP Points 2397

Obtenir plus d'informations de PhantomJS

La prochaine version de PhantomJS (vraisemblablement la 1.9.8, qui suivra la 1.9.7) produira des erreurs comme celle-ci :

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

C'est donc un peu plus utile que le message actuel.

Malheureusement, il n'y a pas de nightly builds pour PhantomJS, donc pour le moment vous devrez compiler votre propre version de master si vous voulez essayer.

Débogage des fichiers réduits

Si vous travaillez avec un fichier minifié, le numéro de ligne ne sera souvent pas très utile, et souvent le débogage du fichier non minifié ne vous donnera pas l'erreur d'analyse.

Pour résoudre ce problème, une fois que vous avez obtenu que phantomjs vous donne le nom du fichier, vous pouvez utiliser la fonction Démonstration en ligne d'Esprima pour obtenir une analyse réelle de votre code JavaScript :

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

À partir de là, vous pouvez saisir des sauts de ligne stratégiques pour isoler l'erreur réelle.

Les outils Lint sont sous-optimaux pour ce cas d'utilisation.

Un outil d'extraction comme jslint ou jshint est plus subjectif qu'un véritable analyseur syntaxique, donc si vous recherchez une erreur de syntaxe très spécifique, je vous recommanderais d'utiliser un véritable analyseur syntaxique, car il ne vérifiera que la validité du code, et non les directives stylistiques subjectives. Je ne veux pas dire que les outils lint n'ont pas de valeur, mais simplement qu'ils ne seront pas aussi utiles pour résoudre ce type de problème.

2 votes

1.9.8 n'a toujours qu'une erreur de syntaxe : : et dans la nouvelle 2.0 script se bloque de façon aléatoire, alors il suffit de Ctrl + Z ;)

2voto

bob Points 19

Vous pouvez également utiliser des linters de syntaxe comme jslint ou jshint.

1 votes

Un linter fait plus que de la validation syntaxique. Dans de nombreux cas, il est légèrement plus critique.

0 votes

J'ai essayé jslint et oui, il était trop opiniâtre et a quitté le code après une centaine de plaintes sur mon choix de style (c'est à dire function( var ){ ) ou l'utilisation des espaces, ou quelque chose d'aussi frivole... le temps que je trouve tous les paramètres pour le rendre sain, j'avais déjà trouvé l'erreur de syntaxe. :/ j'essaierai jshint la prochaine fois cependant !

0voto

jchook Points 700

J'ai reçu SyntaxError: Parse error tout en essayant de require un jquery personnalisé minifié.

J'ai trouvé que la solution était de ajouter une ligne vierge au fond de jquery.min.js .

J'espère que cela aidera quelqu'un. J'utilise PhantomJS 1.9.7.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X