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でファイルを実行します。解析エラーがある場合は、それを報告します。

ファイルが有効な場合、ノードもそれを実行しようとしますが、スクリプトがノード環境で利用できないものに依存している場合は失敗します。したがって、実行時エラーは無視する必要があります。

たとえば、hello-world.js の場合:

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

nodeで実行します:

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な構文が含まれています。構文バリデーターで確認する必要があります。私が作成したオンライン ツールが解決策の 1 つになる可能性があります。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 Tools は、このユースケースには最適ではありません

jslint や jshint などの lint ツールは、実際のパーサーよりも独断的です。そのため、非常に具体的な構文エラーを探している場合は、コードの有効性のみをチェックし、独断的なスタイリング ガイドラインではなく、実際のパーサーを使用することをお勧めします。lint ツールに価値がないと言っているのではなく、この種の問題の解決には役立たないというだけです。

于 2014-02-20T20:48:10.970 に答える
2

jslintやjshintなどの構文リンターを使用することもできます

于 2013-02-16T08:19:13.320 に答える
0

解析エラーが見つからない場合は Phantom を通常どおり実行し、そうでない場合はエラーを表示する単純なシェル スクリプトを使用します。ノードを介してスクリプトを実行SyntaxErrorし、出力をチェックしてから、エラーがある場合はノードをターミナルに再実行します。すべてのコマンド ライン引数を Phantom に渡します。

このメソッドの失敗モードは、node パーサーが 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
于 2016-03-01T16:57:53.770 に答える
0

私は同じ問題を抱えていましたが、解決策はどれもうまくいきませんでした。

私のページは現在のブラウザーのバージョンで正しく動作していたので、問題はおそらく PhantomJS の Webkit でサポートされていない構文であると考えました。

私がしたことは、PhantomJS が使用していた Webkit のバージョンを調べることでし34.534

ここで、同じ Webkit を使用して、またはそれに近い Chromium バージョンを見つける必要があります(Mac の場合)。

最終的にMac OSX 267668を使用してインストールしました。

PhantomJS と同じ URL を読み込んだところUncaught SyntaxError: Unexpected token、完全なスタック トレースを含む実際の URL が表示されました。

それが役立つことを願っています。

于 2019-05-10T07:13:39.880 に答える