web-dev-qa-db-fra.com

obtenir plus d'informations de phantomjs Message "SyntaxError: Parse error"

J'ai un long script qui n'a pas été écrit par moi. Quand je le lance, je reçois:

phantomjs file.js
SyntaxError: Parse error

j'ai vérifié le manuel et --help, et le meilleur que j'ai pu trouver était:

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

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

53
gcb

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

Si le fichier est valide, alors node tentera également de l'exécuter, ce qui échouera si votre script dépend de quelque chose qui n'est pas disponible dans votre environnement node. Vous devrez donc ignorer toutes les erreurs 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 node:

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
81
Philip Dorrell

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

12
Ariya Hidayat

Obtenir plus d'informations de PhantomJS

La prochaine version de PhantomJS (vraisemblablement elle sera la 1.9.8, quoi qu'il arrive après la 1.9.7) produira des erreurs comme ceci:

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 builds nocturnes pour PhantomJS, donc pour le moment vous devrez compiler votre propre version de master si vous voulez essayer.

Débogage des fichiers minifiés

Si vous travaillez avec un fichier minifié, souvent le numéro de ligne ne sera 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 obtenez phantomjs pour vous donner le nom du fichier, vous pouvez utiliser la démo en ligne d'Esprima pour obtenir une analyse réelle de votre code JavaScript:

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

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 lint comme jslint ou jshint est plus d'opinion qu'un véritable analyseur, donc si vous recherchez une erreur de syntaxe très spécifique, je recommanderais d'utiliser un analyseur réel, car il ne vérifiera que la validité du code et non les directives de style. Je n'implique pas que les outils non pelucheux n'ont pas de valeur, juste qu'ils ne seront pas aussi utiles pour résoudre ce type de problème.

10
JBCP

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

2
bob

J'ai eu le même problème, mais aucune des solutions n'a fonctionné pour moi.

J'ai pensé que le problème était probablement une syntaxe non prise en charge par le webkit de PhantomJS, car ma page fonctionnait correctement dans les versions actuelles des navigateurs.

Ce que j'ai fait, c'est de savoir quelle version de webkit PhantomJS utilisait, pour la 1.9. * C'est ici , 34.534.

Maintenant, nous devons trouver la version Chromium en utilisant le même webkit, ou à proximité, dans ici (pour Mac).

J'ai fini par utiliser le Mac OSX 267668 et je l'ai installé.

Chargé la même URL que PhantomJS, et le voici, un vrai Uncaught SyntaxError: Unexpected token avec une trace de pile complète.

J'espère que ça t'as aidé.

0
YoannM

J'utilise un script Shell simple qui exécutera Phantom normalement si aucune erreur d'analyse n'est trouvée, sinon il affichera les erreurs. Il exécute le script via le nœud, vérifie la présence de SyntaxError dans la sortie, puis réexécute le nœud sur le terminal en cas d'erreurs. Il transmet tous les arguments de la ligne de commande à Phantom.

Le mode d'échec de cette méthode est si votre analyseur de nœud est significativement différent de votre analyseur Phantom. Les miens sont suffisamment proches pour que cela n'ait jamais été un problème.

utilisation: ./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
0
Noland

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

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

J'espère que cela aide quelqu'un. Utilisation de PhantomJS 1.9.7.

0
jchook