получить более подробную информацию от помощи PhantomJS "синтаксис ошибка: сообщение об ошибке парсинга"


у меня есть длинный сценарий, который не был написан мной. Когда я запускаю его, я получаю:

phantomjs file.js
SyntaxError: Parse error

Я проверил руководство и -- помощь, и лучшее, что я мог придумать, было:

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

есть ли лучший способ получить хотя бы номер строки? или вообще какой-нибудь намек?

6 52

6 ответов:

запустите файл с помощью узел. Если есть ошибка синтаксического анализа, он сообщит об этом.

Если файл действителен, то узел также попытается запустить его, что не удастся, если ваш скрипт зависит от чего-то недоступного в вашем узел окружающая среда. Поэтому вам придется игнорировать любые ошибки во время выполнения.

например,Привет-мир.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

код file.js содержит недопустимый синтаксис. Вы должны проверить его с помощью синтаксического валидатора. Онлайн-инструмент, который я создал может быть одним из возможных решений, проверьте http://esprima.org/demo/validate.html.

Получение Дополнительной Информации От 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 неоптимальны для этого случая использования

инструмент lint, такой как jslint или jshint, более самоуверен, чем реальный парсер, поэтому, если вы ищете очень конкретную синтаксическую ошибку, я бы рекомендовал использовать реальный парсер, поскольку он будет проверять только правильность кода, а не самоуверенные рекомендации по стилю. Я не подразумеваю, что инструменты lint не имеют ценности, просто они не будут так полезны для решения этой проблемы тип проблемы.

вы также можете использовать синтаксические линтеры, такие как jslint или jshint

я получил SyntaxError: Parse error при попытке require пользовательский минифицированный jquery.

Я нашел решение было добавить пустую строку на дне jquery.min.js.

надеюсь, это кому-то поможет. Использование PhantomJS 1.9.7.

Я использую простой скрипт оболочки, который будет работать Phantom нормально, если не найдены ошибки синтаксического анализа, в противном случае он будет отображать ошибки. Он запускает скрипт через узел, проверяет наличие SyntaxError в выводе, а затем повторно запускает узел к терминалу, если есть ошибки. Он передает все аргументы командной строки вместе с Фантомом.

режим сбоя для этого метода, если ваш узел парсер значительно отличается от вашего фантомного парсера. Мои достаточно близки, чтобы это никогда не было проблема.

использование: ./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