ExecJS :: ProgramError: Inaspettato token punc «(», atteso punc «:» durante l’esecuzione di asset rake: precompilare sulla produzione

Quando distribuisco la mia app Rails ottengo il seguente errore:

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) 

Il file in questione è valido, funziona su localhost. Ho anche provato a eseguire rake assests:precompile su localhost, tutto passa. Infine, ho provato a rimuovere il contenuto dal file, git push e redeploy – ho ancora lo stesso errore. Solo la rimozione completa del file e la ridistribuzione degli aiuti.

Gradirei qualsiasi idea.

Qui ho trovato aiuto per lo stesso problema che hai avuto.

Esegui la console di rails e:

 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 

Ti mostrerà il file e la linea in cui l’Uglifier sta facendo il problema.

Sospetto, in quel file js, tu abbia qualcosa di simile al seguente:

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

Sostituendolo con il formato giusto,

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

ha funzionato per me

Errore sta dicendo chiaramente, si aspetta “:” ma ha trovato “(“.

Non sono sicuro della tua catena di build, ma sono arrivato incollando lo stesso messaggio di errore in Google.

Questo è chiamato “proprietà stenografiche” in ES2015. Sto usando Babel 6 con Gulp e npm install babel-plugin-transform-es2015-shorthand-properties --save-dev e aggiungere quella trasformazione ai miei plugin babel.

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

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

Basta incontrare lo stesso problema.

Il mio caso è che qualcuno abbia usato la syntax che è supportata solo da ES2015, es

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

mentre questo non è supportato nel nostro ambiente.

E i messaggi di errore sono effettivamente generati da Uglifer.

Potrei usare https://skalman.github.io/UglifyJS-online/ per identificare il numero di riga corretto in cui si è verificato il problema. Per fortuna, almeno il file corretto che ha avuto un problema è stato segnalato da Grunt Uglify

Nel mio caso problema con la definizione della funzione come,

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

A causa della precedente definizione della funzione, ho riscontrato un errore, poiché non è supportato da Uglifier. I parametri predefiniti sono le specifiche del linguaggio ES6 / ES2015.

Per la soluzione al problema precedente è ansible consultare Impostare un valore di parametro predefinito per una funzione JavaScript

Poiché il backtrace non fornisce informazioni sul file danneggiato, per me il modo migliore per identificare l’errore è usare git bisect.

Ti permette di trovare il commit che introduce un bug.

Supponiamo che tu sia padrone, per prima cosa si avvia git bisect:

 $ git bisect start $ git bisect bad 

Poi torni a una revisione precedente, funzionante, supponiamo 20 revisioni fa.

 $ git checkout HEAD~20 

Hai eseguito lo stesso comando

 $ RAILS_ENV=production rake assets:precompile 

Se funziona, contrassegna la revisione come buona:

 $ git bisect good. 

git salterà a un’altra revisione, eseguirai di nuovo lo stesso comando (assets: precompilare) e il bassed sul marco di output lo indicherà come buono / cattivo.

In meno di 1 minuto dovresti essere in grado di trovare qual è il commit che ha introdotto il problema.