从phantomjs获取更多信息“SyntaxError:Parse error”消息

时间:2013-02-16 00:46:04

标签: phantomjs

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

phantomjs file.js
SyntaxError: Parse error

我检查了手册和--help,我能想到的最好的是:

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

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

7 个答案:

答案 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。*)是herezip

现在,我们必须在here(对于Mac)中使用相同的Webkit或与其接近的Chromium版本。

最终使用Mac OSX 267668并安装了它。

加载了与PhantomJS相同的URL,这里是一个具有完整堆栈跟踪的真实34.534

希望有帮助。