Получение дополнительной информации от phantomjs Сообщение "Синтаксис: ошибка анализа"
У меня длинный script, который не был написан мной. Когда я запускаю его, я получаю:
phantomjs file.js
SyntaxError: Parse error
Я проверил руководство и --help, и лучшее, что я мог придумать, было:
phantomjs --debug=yes file.js
(irrelevant debug statement from CookieJar)
SyntaxError: Parse error
Есть ли лучший способ получить хотя бы номер строки? или любой намек на всех?
Ответы
Ответ 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
с полной трассировкой стека.
Надеюсь, это поможет.