ExecJS:: ProgramError: Unexpected token punc " ( ", expected punc": "lors de l'exécution de rake assets: précompile on production

lors du déploiement de mon application Rails j'obtiens l'erreur suivante:

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)

Le fichier en question est valide, il fonctionne sur localhost. J'ai aussi essayé de courir rake assests:precompile sur localhost, tout passe. Enfin, j'ai essayé de supprimer le contenu du fichier, git push et de redéployer - j'ai toujours eu la même erreur. Uniquement supprimer complètement le fichier et re-déployer les aides.

apprécierait toutes les idées.

55
demandé sur snitko 2015-05-24 13:24:30

7 réponses

Ici, j'ai trouvé de l'aide pour le même problème que vous.

console de rails de roulement et:

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

il vous montrera le fichier et la ligne où L'Uglifier fait le problème.

194
répondu Radovan Skendzic 2017-05-23 10:31:36

je soupçonne, dans ce fichier js, que vous avez quelque chose comme ce qui suit:

var User = {
    getName() {
        alert("my name");
    }
}

en le remplaçant par le bon format,

var User = {
    getName: function() {
        alert("my name");
    }
}

travaillait pour moi.

Erreur est dit clairement, il s'attend à ":" mais il a trouvé "(".

30
répondu MadCoder 2015-09-12 01:03:15

Je ne suis pas sûr de votre chaîne de compilation, mais je suis arrivé ici en collant le même message d'erreur dans Google.

qui est appelé "propriétés sténographiques" dans ES2015. J'utilise Babel 6 avec Gulp et j'avais besoin de faire un npm install babel-plugin-transform-es2015-shorthand-properties --save-dev et d'ajouter cette transformation à mes plugins babel.

.pipe(babel({
    plugins: [
        'transform-es2015-shorthand-properties'
    ]
}))

https://github.com/babel/babel/tree/master/packages/babel-plugin-transform-es2015-shorthand-properties

6
répondu jamie-wilson 2016-06-27 10:42:08

rencontre juste le même problème.

mon cas est quelqu'un syntaxe utilisé qui est seulement le soutien depuis ES2015, ex

function someThing(param = true) {
    // do something here
};

bien que cela ne soit pas pris en charge dans notre environnement.

et les messages d'erreur sont en fait générés par Uglifer.

5
répondu 湯凱甯 2016-04-12 03:42:29

je pourrais utiliser https://skalman.github.io/UglifyJS-online / pour identifier le bon numéro de ligne où se trouvait le problème. Heureusement, au moins le bon fichier qui avait un problème a été souligné par Grunt uglify

5
répondu Amrudesh 2017-03-15 06:41:54

dans mon cas problème avec la définition de la fonction comme,

function someFunctionName(param1, param2=defaultValue){
  //code 
}

en raison de la définition de la fonction ci-dessus je recevais erreur, car il n'est pas supporté par Uglifier. Les paramètres par défaut sont la spécification de langue ES6/ES2015.

pour la solution au problème ci-dessus, vous pouvez vous référer à définir une valeur de paramètre par défaut pour une fonction JavaScript

3
répondu ShilpeshAgre 2017-07-10 13:00:06

comme le backtrace ne fournit pas d'informations sur le fichier corrompu, pour moi la meilleure façon d'identifier l'erreur est d'utiliser git bisect.

il vous permet de trouver la propagation qui introduit un bug.

supposons que vous êtes sur master, d'abord vous commencez git bisect:

$ git bisect start
$ git bisect bad 

ensuite, vous revenez à une révision précédente, en cours, supposons qu'il y a 20 révisions.

$ git checkout HEAD~20

vous exécutez la même commande

$ RAILS_ENV=production rake assets:precompile

si cela fonctionne, vous marquez la révision comme bonne:

$ git bisect good.

git va passer à une autre révision, vous exécutez à nouveau la même commande (assets:précompile) et bassed sur le point de sortie qu'il est bon / mauvais.

en moins d'une minute Vous devriez être en mesure de trouver quel est le commit qui a introduit la question.

0
répondu Arnold Roa 2018-03-10 03:39:38