54

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

phantomjs file.js
SyntaxError: Parse error

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

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

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

4

7 回答 7

82

使用node运行文件。如果有解析错误,它将报告它。

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

例如,给定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
于 2013-08-26T23:43:47.960 回答
12

file.js的语法无效。您应该使用语法验证器对其进行检查。我创建的在线工具可能是一种可能的解决方案,请查看http://esprima.org/demo/validate.html

于 2013-02-16T04:43:05.080 回答
10

从 PhantomJS 获取更多信息

PhantomJS 的下一个版本(大概是 1.9.8,不管是 1.9.7 之后的版本)将输出如下错误:

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

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

不幸的是,没有针对 PhantomJS 的夜间构建,所以此时如果你想尝试这个,你需要编译你自己的 master 版本。

调试缩小文件

如果您正在使用缩小文件,通常行号不会很有帮助,并且通常调试未缩小文件不会给您解析错误。

为了解决这个问题,一旦你让 phantomjs 给你文件名,你就可以使用Esprima 的在线演示来获取 JavaScript 代码的实际解析:

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

从那里,您可以输入战略换行符以隔离实际错误。

对于此用例,Lint 工具不是最佳选择

像 jslint 或 jshint 这样的 lint 工具比真正的解析器更固执己见,所以如果您正在寻找一个非常具体的语法错误,我建议您使用真正的解析器,因为它只会检查代码的有效性,而不是固执己见的样式指南。我并不是说 lint 工具没有价值,只是它们对解决这类问题没有帮助。

于 2014-02-20T20:48:10.970 回答
2

您还可以使用语法 linter,例如 jslint 或 jshint

于 2013-02-16T08:19:13.320 回答
0

SyntaxError: Parse error在尝试require自定义缩小 jquery 时收到。

我发现解决方案jquery.min.js.

希望这可以帮助某人。使用 PhantomJS 1.9.7。

于 2015-02-16T17:46:18.067 回答
0

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

如果您的节点解析器与您的 Phantom 解析器显着不同,则此方法的失败模式是。我的距离很近,从来都不是问题。

用法:./debug.sh --myArg1 val1 --myArg2 val2

调试.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
于 2016-03-01T16:57:53.770 回答
0

我确实有同样的问题,但没有一个解决方案对我有用。

我认为这个问题可能是 PhantomJS 的 webkit 不支持的语法,因为我的页面在当前浏览器版本中正常工作。

我所做的是找出 PhantomJS 使用的 webkit 版本,对于 1.9.* 它在这里34.534.

现在我们必须在这里找到使用相同 webkit 或接近它的 Chromium 版本(对于 Mac)。

最终选择了Mac OSX 267668并安装了它。

加载了与 PhantomJS 相同的 URL,这是一个Uncaught SyntaxError: Unexpected token具有完整堆栈跟踪的真实 URL。

希望有帮助。

于 2019-05-10T07:13:39.880 回答