web-dev-qa-db-fra.com

ExecJS :: ProgramError: jeton inattendu punc «(», attendu punc «:» lors de l'exécution d'actifs rake: précompile en production

Lors du déploiement de mon Rails, le message d'erreur suivant s'affiche:

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, cela 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 redéployer - j'ai toujours la même erreur. Seulement supprimer complètement le fichier et redéployer les aides.

J'apprécierais toutes les idées.

61
snitko

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

Exécuter Rails console 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 crée le problème.

231
Radovan Skendzic

Je soupçonne que, dans ce fichier js, vous avez quelque chose comme:

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

Le remplacer par le bon format,

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

a travaillé pour moi.

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

32
MadCoder

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

Cela s'appelle "propriétés abrégées" dans ES2015. J'utilise Babel 6 avec Gulp et je devais faire un npm install babel-plugin-transform-es2015-shorthand-properties --save-dev et ajoutez 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
jamie-wilson

Juste rencontrer le même problème.

Mon cas est une syntaxe utilisée par quelqu'un qui n'est supportée que depuis ES2015, ex

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

alors que cela n’est pas pris en charge dans notre environnement.

Et les messages d'erreur sont en réalité générés par Uglifer.

6
湯凱甯

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

5
Amrudesh

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

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

En raison de la définition de la fonction ci-dessus, je recevais une erreur, car elle n'est pas prise en charge par Uglifier. Les paramètres par défaut sont les spécifications de langage ES6/ES2015.

Pour résoudre le 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
ShilpeshAgre

Si la réponse de Radovan ne fonctionne pas pour vous en raison d'un problème dans une bibliothèque plutôt que de votre code, vous pouvez essayer de mettre à niveau Uglifier et d'activer la compilation ES6.

Gemfile.lock

gem 'uglifier', '~> 4.1'

config/environnements/production.rb

config.assets.js_compressor = Uglifier.new(harmony: true)
2
sma

Comme la trace ne fournit pas d'informations sur le fichier corrompu, le meilleur moyen d'identifier l'erreur est d'utiliser git bisect.

Il vous permet de trouver le commit qui introduit un bogue.

Supposons que vous soyez maître, vous commencez d'abord par créer une bissectrice:

$ git bisect start
$ git bisect bad 

Ensuite, vous revenez à une précédente révision de travail, supposons 20 ans auparavant.

$ 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 passera à une autre révision, vous exécuterez à nouveau la même commande (assets: precompile) et une basse sur la sortie la marquera comme bonne/mauvaise.

En moins d'une minute, vous devriez être capable de trouver quel est le commit qui a introduit le problème.

0
Arnold Roa