Подтвердить что ты не робот

Получение дополнительной информации от phantomjs Сообщение "Синтаксис: ошибка анализа"

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

phantomjs file.js
SyntaxError: Parse error

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

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

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

4b9b3361

Ответ 1

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

Если файл действителен, то node также попытается запустить его, что не удастся, если ваш script зависит от того, что недоступно в 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

Ответ 2

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

Ответ 3

Получение дополнительной информации от 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

Оттуда вы можете ввести стратегические разрывы строк, чтобы изолировать фактическую ошибку.

Инструменты Lint являются субоптимальными для этого прецедента

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

Ответ 4

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

Ответ 5

Я получил SyntaxError: Parse error, пытаясь require настроить мини-jquery.

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

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

Ответ 6

Я использую простую оболочку script, которая будет запускать Phantom обычно, если ошибки анализа не обнаружены, иначе будут отображаться ошибки. Он запускает script через node, проверяет на SyntaxError на выходе и затем повторно запускает node на терминал, если есть ошибки. Он передает все аргументы командной строки до 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

Ответ 7

У меня была такая же проблема, но ни одно из решений не помогло мне.

Я решил, что проблема, возможно, заключалась в неподдерживаемом синтаксисе веб-набора PhantomJS, поскольку моя страница работала корректно в текущих версиях браузеров.

Что я сделал, так это выяснил, какую версию WebKit использовал PhantomJS для 1.9. * Здесь, 34.534.

Теперь нам нужно найти версию Chromium, использующую тот же веб-набор или близкий к нему, здесь (для Mac).

Закончил работу с Mac OSX 267668 и установил его.

Загрузил тот же URL, что и PhantomJS, и вот он, настоящий Uncaught SyntaxError: Unexpected token с полной трассировкой стека.

Надеюсь, это поможет.