2013-02-16 3 views
52

У меня есть длинный скрипт, который не был написан мной. Когда я запускаю его я получаю:Получение дополнительной информации от phantomjs Сообщение «SyntaxError: Parse error»

phantomjs file.js 
SyntaxError: Parse error 

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

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

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

ответ

81

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

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

Например, если привет-world.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 
+0

Это быстрый и умный способ запуска локальной проверки синтаксиса в js-файлах. Я нахожу это намного быстрее, чем онлайн-инструменты, плюс он не упрям. недостаток нужен узлу, но я подозреваю, что у большинства разработчиков phantomjs будет установлен узел. – danmux

+0

Что произойдет, если узел встретит какое-то окно глобального? Или если фантом, который работает .. хром? это другая версия для узла? Это нормально для некоторых основных случаев. Я думаю, –

+0

мой рецепт на всех make-файлах: 'find src/js/-name \ * js -exec node \ {\} \; 2> & 1 | grep -B 5 СинтаксисError || exit 0 && exit 1; 'оно не будет выполнено. Создайте правило, если есть какая-либо синтаксическая ошибка, и покажите вам, где это происходит. – gcb

12

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

+0

Принимая это один (это был первый, чтобы предложить проверку синтаксиса в другом месте), как это очевидно, что phantomjs не имеет никакого способа намек на ошибки синтаксиса само по себе. – gcb

2

Вы также можете использовать синтаксис линт как JSLint или jshint

+1

Linter делает больше, чем проверку синтаксиса. Во многих случаях он несколько более самоуверен. –

+0

Я попробовал jslint и да, он был слишком самоуверен и вышел из кода после того, как примерно 100 жалуются на мой выбор стиля (например, 'function (var) {') или использование пробелов или что-то еще, как легкомысленное ... к тому моменту, когда я нашел все настройки, чтобы сделать его нормальным, я уже нашел синтаксическую ошибку. :/попробует jshint в следующий раз, хотя! – gcb

11

Получение дополнительной информации Фро м PhantomJS

Следующая версия PhantomJS (предположительно это будет 1.9.8, что приходит после 1.9.7) будут ошибки вывода, как это:

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

Так что это немного более полезным, чем текущее сообщение ,

К сожалению, нет никаких ночных сборников для PhantomJS, поэтому в это время вам нужно будет скомпилировать свою собственную версию мастера, если вы хотите попробовать это.

Debugging уменьшенный файлы

Если вы работаете с уменьшенным файлом, часто номер строки не будет очень полезным, и часто отладки неразделанной уменьшенной файл не дадите вам синтаксическую ошибки.

Чтобы решить эту проблему, как только вы получите phantomjs дать вам имя файла, вы можете использовать online demo of Esprima, чтобы получить фактический разбор кода JavaScript:

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

От там, вы можете введите стратегические разрывы для изоляции фактической ошибки.

Lint Инструменты Sub-оптимальна для этого потребительной случае

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

+1

1.9.8 все еще имеет только синтаксическую ошибку :: и в новом скрипте 2.0 случайным образом, так что просто Ctrl + Z;) – user956584

1

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

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

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

0

Я использую простой сценарий оболочки, который будет запускать 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 
Смежные вопросы