从phantomjs“SyntaxError:parsing错误”消息中获取更多信息

我有一个很长的脚本,不是我写的。 当我运行它时,我得到:

phantomjs file.js SyntaxError: Parse error 

我检查了手册和 – 帮助,最好的我可以想出是:

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

有没有更好的方法来获得至less一个行号? 或者任何暗示?

节点运行文件。 如果有parsing错误,它会报告它。

如果文件是有效的,那么节点也会尝试运行它,如果你的脚本依赖于你的节点环境中不可用的东西,这将会失败。 所以你将不得不忽略任何运行时错误。

例如,给出hello-world.js:

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

运行它与节点

 node hello-world.js 

输出:

 /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 

你的file.js包含无效的语法。 你应该用一个语法validation器来检查它。 我创build的在线工具可能是一个可能的解决scheme,请查看http://esprima.org/demo/validate.html

从PhantomJS获取更多信息

PhantomJS的下一个版本(估计它会是1.9.8,不pipe是在1.9.7之后)会输出这样的错误:

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

所以这比当前消息稍微有用。

不幸的是,PhantomJS并没有每晚的编译版本,所以在这个时候你需要编译你自己的版本,如果你想试试这个版本的话。

debugging缩小的文件

如果你正在使用一个缩小的文件,通常行号不会很有帮助,经常debugging未缩小的文件不会给你分析错误。

为了解决这个问题,一旦你得到phantomjs给你的文件的名称,你可以使用Esprima在线演示得到一个实际的JavaScript代码parsing:

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

从那里,你可以input战略换行来隔离实际的错误。

Lint工具在这个用例中是次优的

像jslint或jshint这样的lint工具比真正的parsing器更有见地,所以如果你正在寻找一个非常具体的语法错误,我会build议使用一个真正的parsing器,因为它只会检查代码的有效性,而不是自定义的样式准则。 我并不是暗示lint工具没有价值,只是它们不会有助于解决这类问题。

您也可以使用像jslint或jshint这样的语法库

我收到了SyntaxError: Parse error同时试图require自定义缩小的jQuery。

我发现解决scheme是在jquery.min.js的底部添加一个空行

希望这有助于某人。 使用PhantomJS 1.9.7。

我使用一个简单的shell脚本,如果没有发现parsing错误,它将正常运行Phantom,否则会显示错误。 它通过节点运行脚本,在输出中检查SyntaxError ,如果有错误,则重新运行节点到terminal。 它将所有命令行parameter passing给Phantom。

这种方法的失败模式是,如果你的节点parsing器与你的Phantomparsing器显着不同。 我的足够接近,这从来没有成为一个问题。

用法: ./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