ExecJS:: ProgramError: Неожиданный токен punc "(", ожидаемый punc ":" при запуске rake assets: прекомпиляция на производстве
При развертывании моего приложения Rails появляется следующая ошибка:
rake aborted!
ExecJS::ProgramError: Unexpected token punc «(», expected punc «:» (line: 15, col: 14, pos: 265)
Error
at new JS_Parse_Error (/tmp/execjs20150524-4411-1p45n63js:2359:10623)
at js_error (/tmp/execjs20150524-4411-1p45n63js:2359:10842)
at croak (/tmp/execjs20150524-4411-1p45n63js:2359:19086)
at token_error (/tmp/execjs20150524-4411-1p45n63js:2359:19223)
at expect_token (/tmp/execjs20150524-4411-1p45n63js:2359:19446)
at expect (/tmp/execjs20150524-4411-1p45n63js:2359:19584)
at /tmp/execjs20150524-4411-1p45n63js:2359:28513
at /tmp/execjs20150524-4411-1p45n63js:2359:19957
at expr_atom (/tmp/execjs20150524-4411-1p45n63js:2359:27269)
at maybe_unary (/tmp/execjs20150524-4411-1p45n63js:2359:30019)new JS_Parse_Error ((execjs):2359:10623)
js_error ((execjs):2359:10842)
croak ((execjs):2359:19086)
token_error ((execjs):2359:19223)
expect_token ((execjs):2359:19446)
expect ((execjs):2359:19584)
(execjs):2359:28513
(execjs):2359:19957
expr_atom ((execjs):2359:27269)
maybe_unary ((execjs):2359:30019)
Файл, о котором идет речь, действителен, он работает на localhost. Я также попытался запустить rake assests:precompile
на localhost, все это проходит. Наконец, я попытался удалить содержимое из файла, git push и redeploy - все равно получил ту же ошибку. Помогает только полное удаление файла и повторное развертывание.
Поблагодарили бы за любые идеи.
Ответы
Ответ 1
Здесь я нашел справку по той же проблеме, что и у вас.
Запустите консоль рельсов и:
JS_PATH = "app/assets/javascripts/**/*.js";
Dir[JS_PATH].each do |file_name|
puts "\n#{file_name}"
puts Uglifier.compile(File.read(file_name))
end
Он покажет вам файл и строку, где Uglifier создает проблему.
Ответ 2
Я подозреваю, что в этом js файле у вас есть что-то вроде следующего:
var User = {
getName() {
alert("my name");
}
}
Заменив его в нужном формате,
var User = {
getName: function() {
alert("my name");
}
}
работал у меня.
Ошибка явно говорит, что она ожидает ":", но она обнаружила "(".
Ответ 3
Я не уверен в вашей цепочке сборки, но я пришел сюда, вставив одно и то же сообщение об ошибке в Google.
Это называется "стенографические свойства" в ES2015. Я использую Babel 6 с Gulp и вам нужно сделать npm install babel-plugin-transform-es2015-shorthand-properties --save-dev
и добавить это преобразование в мои плагины babel.
.pipe(babel({
plugins: [
'transform-es2015-shorthand-properties'
]
}))
https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-es2015-shorthand-properties
Ответ 4
Я мог бы использовать https://skalman.github.io/UglifyJS-online/, чтобы определить правильный номер строки, где была проблема. К счастью, по крайней мере, правильный файл, который имел проблему, был отмечен grunt uglify
Ответ 5
Просто встретите ту же проблему.
В моем случае используется синтаксис, который поддерживается только с ES2015, ex
function someThing(param = true) {
// do something here
};
хотя это не поддерживается в нашей среде.
И сообщения об ошибках фактически генерируются Uglifer.
Ответ 6
В моем случае проблема с определением функции вроде,
function someFunctionName(param1, param2=defaultValue){
//code
}
Из-за вышеописанного определения функции я получал ошибку, поскольку она не поддерживается Uglifier. Параметры по умолчанию - это спецификация языка ES6/ES2015.
Для решения вышеуказанной проблемы вы можете ссылаться Установить значение параметра по умолчанию для функции JavaScript