UglifyJS lancia un token imprevisto: parola chiave (const) con node_modules


90

Un piccolo progetto che ho iniziato utilizza un modulo nodo (installato tramite npm ) che dichiara le constvariabili. L'esecuzione e il test di questo progetto va bene, ma browserify fallisce quando viene eseguito UglifyJS.

Token imprevisto: parola chiave (const)

Ecco un file Gulp generico che ho utilizzato con successo per alcuni altri progetti passati senza questo problema (cioè senza quel particolare modulo nodo).

gulpfile.js

'use strict';

const browserify = require('browserify');
const gulp = require('gulp');
const source = require('vinyl-source-stream');
const derequire = require('gulp-derequire');
const buffer = require('vinyl-buffer');
const uglify = require('gulp-uglify');
const sourcemaps = require('gulp-sourcemaps');
const gutil = require('gulp-util');
const path = require('path');
const pkg = require('./package');
const upperCamelCase = require('uppercamelcase');

const SRC_PATH = path.dirname(pkg.main);
const DIST_PATH = path.dirname(pkg.browser);

const INPUT_FILE = path.basename(pkg.main);
const OUTPUT_FILE = path.basename(pkg.browser);

const MODULE_NAME = upperCamelCase(pkg.name);


gulp.task('default', () => {
  // set up the browserify instance on a task basis
  var b = browserify({
    entries: INPUT_FILE,
    basedir: SRC_PATH,
    transform: ['babelify'],
    standalone: MODULE_NAME,
    debug: true
  });

  return b.bundle()
    .pipe(source(OUTPUT_FILE))
    .pipe(buffer())
    .pipe(derequire())
    .pipe(sourcemaps.init({loadMaps: true}))
    .pipe(uglify())
    .on('error', gutil.log)
    .pipe(sourcemaps.write('.'))
    .pipe(gulp.dest(DIST_PATH))
  ;
});

Ho cercato fissare questo da sostituire tutto consta varin quel modulo NPM-installato, e tutto va bene. Quindi non capisco il fallimento.

Cosa c'è che non va const? A meno che qualcuno non utilizzi IE10, tutti i principali browser supportano questa sintassi.

C'è un modo per risolvere questo problema senza richiedere una modifica a quel modulo del nodo?

Aggiornare

Ho temporaneamente (o permanentemente) sostituito UglifyJS con Butternut e sembra funzionare.


Non è un problema con la versione del nodo? Non ti serve come il nodo 8+ per avere a constdisposizione? (non sono sicuro di quando sia stato effettivamente introdotto)
laurent

Uso constdalla v4. E attualmente sto usando 8.9.1 LTS.
Yanick Rochon

Ok, allora è strano. Qual è il messaggio di errore visualizzato?
laurent

@ this.lau_ lo stesso messaggio di errore del titolo, ma l'ho aggiunto anche nella domanda per chiarezza.
Yanick Rochon

Non deve necessariamente riguardare il "const". Potrebbe essere uno dei moduli di cui hai bisogno.
James,

Risposte:


92

Come accennato da ChrisR , UglifyJS non supporta affatto ES6.

Devi usare terser-webpack-plugin per ES6 (webpack @ 5 userà questo plugin per l'amplificazione)

npm install terser-webpack-plugin --save-dev

Quindi definisci nel tuo pluginsarray

const TerserPlugin = require('terser-webpack-plugin')

  new TerserPlugin({
    parallel: true,
    terserOptions: {
      ecma: 6,
    },
  }),

fonte


1
Forse dovresti suggerire npm install --save-dev terser-webpack-plugin.
Rafa

2
Apprezzo molto questa risposta perché mi ha ricordato la terserlibreria che terser-webpack-pluginusa sotto. Nota per gli altri: terserpuò essere usato da solo come cli così com'era uglify-js(cioè webpack non è un requisito) che era esattamente ciò di cui avevo bisogno.
John Lee

1
ma dobbiamo usare webpack per usare questa soluzione?
Enrique

@enrique dipende da cosa vuoi fare, per costruire un sito web che soddisfi le reali esigenze aziendali dovresti assolutamente provare a webpack. Abbiamo riscontrato questo problema nella comunità webpack, quindi la mia risposta è ben valutata ma tecnicamente non è necessario webpack per creare codice ES6
Ser

Terser è stato scelto per webpack @ 4 in github.com/webpack/webpack/pull/8392
Trivikram

39

UglifyJS non supporta es6. constè una dichiarazione es6, quindi genera un errore.

Ciò che è strano è che il pacchetto che usi non trasferisce i suoi file in es5 per essere usati ovunque.

Se vuoi ancora usare UglifyJS (per riutilizzare la configurazione per esempio) usa la versione compatibile con ES6 +, uglify-es . ( Attenzione : orauglify-es è abbandonato .)

E come ha detto Ser , ora dovresti usare terser-webpack-plugin.


3
Puoi anche sostituire gulp-uglifycon gulp-uglify-es: npmjs.com/package/gulp-uglify-es
ChrisR

3
UglifyJS does not support es6 . Grazie! Non sono riuscito a trovare quell'informazione da nessuna parte.
Karl Pokus

utilizzalo gulp-terserse la migrazione a webpack non rientra nel tuo budget.
Riki137

7

Ho avuto lo stesso problema e il plug -in gulp gulp-uglify-es ha risolto il problema.

Penso che sia la decisione più semplice.

Basta installare:

npm i gulp-uglify-es --save-dev

dopodiché nel codice cambia solo questa riga

const uglify = require('gulp-uglify');

a questa:

const uglify = require('gulp-uglify-es').default;

NB proprietà .default è fondamentale altrimenti avrai un errore che uglify non è una funzione.

Come accennato in precedenza e in quanto parte dell'operatore const ES6 può essere elaborato solo dal più moderno plug-in gulp es6 "gulp-uglify-es"

Il resto del codice non deve essere modificato.

I migliori saluti!


testato e funzionante con "node: v12.14", "gulp cli v2.2.1", "gulp local v4.0.2".
ioojimooi

2

Ho appena avuto questo problema con un progetto Gulp che ho refactoring e per qualche motivo ho avuto problemi con il plug-in Terser Gulp ufficiale. Questo (gulp-terser) ha funzionato senza problemi.


0

Usa uglify-es-webpack-plugin è meglio

    const UglifyEsPlugin = require('uglify-es-webpack-plugin')



    module.exports = {
    plugins: [
            new UglifyEsPlugin({
                compress:{
                    drop_console: true
                }
            }),
    ] 
    }

7
Questa è un'opinione, per favore spiega perché è migliore.
ChrisR

0

L'ho sostituito UglifyJScon YUI Compressor JSall'interno della GUI di PHPStorm .. Ora funziona.


0

Non penso davvero che questo approccio sia buono, ma nel mio caso dovevo farlo una volta e dimenticarmene, quindi sono andato sul sito Web di babel , ho trasferito online da es6 a es5 e ho sostituito l'output!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.