javascript - rails - ExecJS:: ProgramError: token inesperado punc «(», punc esperado «:» al ejecutar activos de rake: precompilación en producción
ruby on rails heroku (8)
Al implementar mi aplicación Rails me sale el siguiente error:
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)
El archivo en cuestión es válido, funciona en localhost.
También intenté ejecutar
rake assests:precompile
en localhost, todo pasa.
Finalmente, traté de eliminar el contenido del archivo, git push y volver a implementar, aún obtuve el mismo error.
Solo eliminar completamente el archivo y volver a implementar ayuda.
Agradecería cualquier idea.
Como la traza inversa no proporciona información sobre el archivo dañado, para mí la mejor manera de identificar el error es usar git bisect.
Le permite encontrar el commit que introduce un error.
Supongamos que estás en master, primero comienzas git bisect:
$ git bisect start
$ git bisect bad
Luego regresa a una revisión previa que funciona, supongamos que hace 20 revisiones.
$ git checkout HEAD~20
Ejecutas el mismo comando
$ RAILS_ENV=production rake assets:precompile
Si funciona, marca la revisión como buena:
$ git bisect good.
git saltará a otra revisión, ejecutará el mismo comando nuevamente (activos: precompilación) y basará en la salida marcarlo como bueno / malo.
En menos de 1 minuto, debería poder encontrar cuál es la confirmación que introdujo el problema.
En mi caso, el problema con la definición de funciones como,
function someFunctionName(param1, param2=defaultValue){
//code
}
Debido a la definición de función anterior, recibí un error, ya que no es compatible con Uglifier. Los parámetros predeterminados son las especificaciones del idioma ES6 / ES2015.
Para solucionar el problema anterior, puede consultar Establecer un valor de parámetro predeterminado para una función de JavaScript
No estoy seguro de su cadena de compilación, pero llegué aquí pegando el mismo mensaje de error en Google.
Eso se llama ''propiedades abreviadas'' en ES2015.
Estoy usando Babel 6 con Gulp y necesitaba hacer una
npm install babel-plugin-transform-es2015-shorthand-properties --save-dev
y agregar esa transformación a mis complementos de babel.
.pipe(babel({
plugins: [
''transform-es2015-shorthand-properties''
]
}))
Podría usar https://skalman.github.io/UglifyJS-online/ para identificar el número de línea correcto donde estaba el problema. Afortunadamente, al menos el archivo correcto que tenía un problema fue señalado por grunt uglify
Si la respuesta de Radovan no funciona para usted debido a un problema en una biblioteca en lugar de su código, puede intentar actualizar Uglifier y habilitar la compilación ES6.
Gemfile.lock
gem ''uglifier'', ''~> 4.1''
config / ambientes / production.rb
config.assets.js_compressor = Uglifier.new(harmony: true)
Solo encuentra el mismo problema.
Mi caso es que alguien usó una sintaxis que solo es compatible desde ES2015, ex
function someThing(param = true) {
// do something here
};
Si bien esto no es compatible con nuestro entorno.
Y los mensajes de error son realmente generados por Uglifer.
Sospecho que, en ese archivo js, tienes algo como lo siguiente:
var User = {
getName() {
alert("my name");
}
}
Reemplazándolo con el formato correcto,
var User = {
getName: function() {
alert("my name");
}
}
trabajó para mi.
El error dice claramente, está esperando ":" pero encontró "(".
Aquí encontré ayuda para el mismo problema que tenía.
Ejecute la consola de rieles y:
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
Le mostrará el archivo y la línea donde Uglifier está causando el problema.