我有一个很长的脚本,不是我写的。当我运行它时,我得到:
phantomjs file.js
SyntaxError: Parse error
我检查了手册和--help,我能想到的最好的是:
phantomjs --debug=yes file.js
(irrelevant debug statement from CookieJar)
SyntaxError: Parse error
有没有更好的方法来获得至少一个行号?或任何暗示?
答案 0 :(得分:81)
使用节点运行该文件。如果存在解析错误,它将报告它。
如果文件有效,则节点也会尝试运行该文件,如果您的脚本依赖于节点环境中不可用的内容,则会失败。所以你必须忽略任何运行时错误。
例如,给定 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
答案 1 :(得分:12)
您的file.js
包含无效语法。您应该使用语法验证器进行检查。我创建的在线工具可以是一种可能的解决方案,请查看http://esprima.org/demo/validate.html。
答案 2 :(得分:10)
从PhantomJS获取更多信息
PhantomJS的下一个版本(可能是1.9.8,无论是1.9.7之后)都会输出如下错误:
SyntaxError: Parse error
http://localhost:9000/scripts/49e8b4f4.vendor.js:8
这比当前消息更有用。
不幸的是PhantomJS没有夜间版本,所以在这个时候你需要编译你自己的版本的master,如果你想尝试这个。
调试缩小文件
如果您正在使用缩小的文件,通常行号不会非常有用,并且通常调试未缩小的文件不会给您解析错误。
要解决这个问题,一旦你让phantomjs给你文件的名称,你可以使用online demo of Esprima来获得JavaScript代码的实际解析:
http://esprima.org/demo/parse.html
从那里,您可以输入策略性换行符以隔离实际错误。
Lint工具对于此用例
是次优的像jslint或jshint这样的lint工具比真正的解析器更有见解,所以如果你正在寻找一个非常具体的语法错误,我建议使用一个真正的解析器,因为它只检查代码的有效性,而不是固执己见造型指南。我并不是说暗示工具没有价值,只是因为它们不会对解决这类问题有所帮助。
答案 3 :(得分:2)
您还可以使用jslint或jshint等语法链接
答案 4 :(得分:0)
我在尝试SyntaxError: Parse error
自定义缩小的jquery时收到了require
。
我发现解决方案是在jquery.min.js
的底部添加一个空行。
希望这有助于某人。使用PhantomJS 1.9.7。
答案 5 :(得分:0)
我使用一个简单的shell脚本,如果没有找到解析错误,它将正常运行Phantom,否则它将显示错误。它通过节点运行脚本,检查输出中的SyntaxError
,如果有错误则重新运行节点到终端。它将所有命令行参数传递给Phantom。
此方法的失败模式是您的节点解析器与Phantom解析器明显不同。我的距离很近,以至于它从来都不是问题。
用法:./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
答案 6 :(得分:0)
我确实遇到了同样的问题,但是没有一个解决方案对我有用。
我认为该问题可能是PhantomJS的Webkit不支持的语法,因为我的页面在当前浏览器的版本中可以正常工作。
我所做的就是找出PhantomJS使用的哪个Webkit版本(1.9。*)是here,zip
。
现在,我们必须在here(对于Mac)中使用相同的Webkit或与其接近的Chromium版本。
最终使用Mac OSX 267668并安装了它。
加载了与PhantomJS相同的URL,这里是一个具有完整堆栈跟踪的真实34.534
。
希望有帮助。