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?
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
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 .
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.
Vous pouvez également utiliser des linters de syntaxe comme jslint ou jshint
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é.
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
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.