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.