web-dev-qa-db-ja.com

phantomjs「SyntaxError:Parse error」メッセージから詳細情報を取得

私が書いたのではない長いスクリプトがあります。実行すると次のようになります:

phantomjs file.js
SyntaxError: Parse error

私はマニュアルと--helpをチェックアウトしましたが、思いついたのは次のとおりでした:

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

少なくとも行番号を取得するより良い方法はありますか?または何かヒントはありますか?

53
gcb

nodeでファイルを実行します。解析エラーがある場合、それを報告します。

ファイルが有効な場合、nodeも実行しようとしますが、スクリプトが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
81
Philip Dorrell

きみの file.jsに無効な構文が含まれています。構文検証ツールで確認する必要があります。私が作成したオンラインツールは、可能な解決策の1つです。 http://esprima.org/demo/validate.html をチェックしてください。

12
Ariya Hidayat

PhantomJSから詳細情報を取得する

PhantomJSの次のバージョン(おそらく1.9.8、1.9.7以降のバージョン)では、次のようなエラーが出力されます。

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

したがって、これは現在のメッセージよりもわずかに便利です。

残念ながら、PhantomJSのナイトリービルドはありません。そのため、この時点で試してみたい場合は、マスターの独自バージョンをコンパイルする必要があります。

縮小ファイルのデバッグ

縮小されたファイルを使用している場合、行番号は役に立たないことが多く、縮小されていないファイルをデバッグしても解析エラーは発生しません。

これを解決するには、phantomjsを取得してファイル名を取得したら、 Esprimaのオンラインデモ を使用してJavaScriptコードの実際の解析を取得できます。

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

そこから、戦略的な改行を入力して実際のエラーを分離できます。

リントツールは、このユースケースには最適ではありません

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

10
JBCP

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

2
bob

私は同じ問題を抱えていましたが、解決策はありませんでした。

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

私がやったことは、PhantomJSが使用しているWebkitバージョンを見つけることでした。1.9。*では here34.534

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

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

PhantomJSと同じURLをロードしましたが、ここでは実際のUncaught SyntaxError: Unexpected token完全なスタックトレース。

お役に立てば幸いです。

0
YoannM

解析エラーが見つからない場合は通常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
0
Noland

カスタムミニファイされたjqueryをrequireしようとしてSyntaxError: Parse errorを受け取りました。

解決策は空白行を追加するjquery.min.jsの下部にあることがわかりました。

これが誰かの助けになることを願っています。 PhantomJS 1.9.7を使用します。

0
jchook