obtenir plus d’informations à partir du message «SyntaxError: Parse error» de phantomjs

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 mieux que j’ai pu trouver était:

 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 du tout?

    Exécutez le fichier avec le noeud . S’il y a une erreur d’parsing, elle le signalera.

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

     node hello-world.js 

    Sortie:

     /home/someone/somewhere/hello-world.js:3 console.log("Hello World") ); ^ SyntaxError: Unexpected token ) at Module._comstack (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 1.9.8, quelle que soit la version 1.9.7) produira des erreurs comme celles-ci:

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

    C’est donc légèrement plus utile que le message actuel.

    Malheureusement, il n’y a pas de version nocturne pour PhantomJS, vous devrez donc comstackr votre propre version de master si vous voulez essayer ceci.

    Débogage des fichiers minifiés

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

    Pour résoudre ce problème, une fois que phantomjs vous donne le nom du fichier, vous pouvez utiliser la démo en ligne d’Esprima pour obtenir une parsing réelle de votre code JavaScript:

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

    De là, vous pouvez entrer 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 de filtrage comme jslint ou jshint est plus précis qu’un parsingur réel, donc si vous recherchez une erreur de syntaxe très spécifique, je vous recommande d’utiliser un parsingur réel, car il ne vérifie que la validité du code et non les directives de style. Je ne veux pas dire que les outils à charpie n’ont pas de valeur, mais simplement 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 reçu SyntaxError: Parse error lors de la tentative d’ require un jquery minifié personnalisé.

    J’ai trouvé que la solution consistait à append une ligne vierge au bas de jquery.min.js .

    J’espère que cela aide quelqu’un. Utiliser PhantomJS 1.9.7.

    J’utilise un script shell simple qui exécutera Phantom normalement si aucune erreur d’parsing n’est trouvée, sinon il affichera les erreurs. Il exécute le script via le nœud, vérifie SyntaxError dans la sortie, puis SyntaxError le nœud vers le terminal en cas d’erreur. Il passe tous les arguments de la ligne de commande à Phantom.

    Le mode d’échec pour cette méthode est si l’parsingur de votre noeud est très différent de votre parsingur Phantom. Les miennes sont assez proches pour que ça 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