UglifyJS löst ein unerwartetes Token aus: keyword (const) mit node_modules

90

In einem kleinen Projekt, das ich gestartet habe, wird ein Knotenmodul (über npm installiert ) verwendet, das constVariablen deklariert . Das Ausführen und Testen dieses Projekts ist in Ordnung, aber browserify schlägt fehl, wenn UglifyJS ausgeführt wird.

Unerwartetes Token: Schlüsselwort (const)

Hier ist eine generische Gulp-Datei, die ich erfolgreich für einige andere frühere Projekte ohne dieses Problem verwendet habe (dh ohne dieses bestimmte Knotenmodul).

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))
  ;
});

Ich habe schon versucht , diese Fixierung durch alle zu ersetzen , constum varin diesem npm installierten Modul, und alles ist in Ordnung. Also verstehe ich den Fehler nicht.

Was ist los mit const? Sofern nicht jemand IE10 verwendet, unterstützen alle gängigen Browser diese Syntax.

Gibt es eine Möglichkeit, dies zu beheben, ohne dass eine Änderung an diesem Knotenmodul erforderlich ist?

Aktualisieren

Ich habe UglifyJS vorübergehend (oder dauerhaft) durch Butternut ersetzt und scheine zu funktionieren.

Yanick Rochon
quelle
Ist es nicht ein Problem mit der Knotenversion? Benötigen Sie nicht wie Knoten 8+, um constverfügbar zu sein? (nicht sicher, wann es tatsächlich eingeführt wurde)
Laurent
Ich benutze constseit v4. Und ich benutze derzeit 8.9.1 LTS.
Yanick Rochon
Ok, das ist dann seltsam. Was ist die Fehlermeldung, die Sie sehen?
Laurent
@ this.lau_ die gleiche Fehlermeldung wie im Titel, aber ich habe sie aus Gründen der Klarheit auch in die Frage eingefügt.
Yanick Rochon
Es muss nicht unbedingt um die 'const' gehen. Es könnte eines der Module sein, die Sie benötigen.
James

Antworten:

92

Wie ChrisR erwähnte , unterstützt UglifyJS ES6 überhaupt nicht.

Sie müssen das Terser-Webpack-Plugin für ES6 verwenden (Webpack @ 5 verwendet dieses Plugin zur Uglifizierung).

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

Dann definieren Sie in Ihrem pluginsArray

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

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

Quelle

Ser
quelle
1
Vielleicht solltest du vorschlagen npm install --save-dev terser-webpack-plugin.
Rafa
2
Ich schätze diese Antwort sehr, weil sie mich an die terserBibliothek erinnert, terser-webpack-plugindie darunter verwendet wird. Hinweis für andere: terserKann als Cli verwendet werden, so wie es uglify-jswar (dh Webpack ist keine Voraussetzung), was genau das war, was ich brauchte.
John Lee
1
Aber müssen wir Webpack verwenden, um diese Lösung zu verwenden?
Enrique
@enrique hängt davon ab, was Sie tun möchten. Um eine Website zu erstellen, die den tatsächlichen Geschäftsanforderungen entspricht, sollten Sie das Webpack unbedingt ausprobieren. Wir hatten dieses Problem in der Webpack-Community, daher ist meine Antwort gut bewertet, aber technisch gesehen benötigen Sie kein Webpack, um ES6-Code zu erstellen
Ser
Terser wurde ausgewählt, um Webpack @ 4 in github.com/webpack/webpack/pull/8392
Trivikram
39

UglifyJS unterstützt es6 nicht. constist eine es6-Deklaration, daher wird ein Fehler ausgegeben.

Was seltsam ist, ist, dass das Paket, das Sie verwenden, seine Dateien nicht in es5 transpiliert, um irgendwo verwendet zu werden.

Wenn Sie UglifyJS weiterhin verwenden möchten (um beispielsweise die Konfiguration wiederzuverwenden), verwenden Sie die ES6 + -kompatible Version uglify-es . ( Warnung : uglify-eswird jetzt aufgegeben .)

Und wie Ser erwähnt hat , sollten Sie jetzt verwenden terser-webpack-plugin.

ChrisR
quelle
3
Sie können auch ersetzen gulp-uglifydurch gulp-uglify-es: npmjs.com/package/gulp-uglify-es
ChrisR
3
UglifyJS does not support es6 . Vielen Dank! Ich konnte diese Information nirgendwo finden.
Karl Pokus
Verwenden Sie gulp-terserdiese Option, wenn die Migration zu Webpack nicht in Ihrem Budget liegt.
Riki137
7

Ich hatte das gleiche Problem und das gulp-Plugin gulp-uglify-es löste das Problem.

Ich denke, es ist die einfachste Entscheidung.

Einfach installieren:

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

Danach ändern Sie in Ihrem Code nur noch diese Zeile

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

dazu:

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

Die NB-Eigenschaft .default ist von entscheidender Bedeutung, da sonst der Fehler auftritt, dass uglify keine Funktion ist.

Wie oben erwähnt und als Teil des ES6 const- Operators kann nur das modernere es6-gulp-Plugin "gulp-uglify-es" verarbeitet werden.

Der Rest Ihres Codes muss nicht geändert werden.

Freundliche Grüße!

Christiyan
quelle
getestet und arbeitet mit "node: v12.14", "gulp cli v2.2.1", "gulp local v4.0.2".
ioojimooi
2

Ich hatte gerade dieses Problem mit einem Gulp-Projekt, das ich überarbeitet habe, und aus irgendeinem Grund hatte ich Probleme mit dem offiziellen Terser Gulp-Plugin. Dieser (Schlucker) arbeitete ohne Probleme.

NetOperator Wibby
quelle
0

Verwenden Sie uglify-es-webpack-Plugin ist besser

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



    module.exports = {
    plugins: [
            new UglifyEsPlugin({
                compress:{
                    drop_console: true
                }
            }),
    ] 
    }
NEO ViSiON
quelle
7
Dies ist eine Meinung, bitte erläutern Sie, warum es besser ist.
ChrisR
0

Ich habe ersetzt UglifyJSmit YUI Compressor JSin der GUI von PhpStorm .. Es funktioniert jetzt.

Sjoerd
quelle
0

Ich denke nicht wirklich, dass dieser Ansatz gut ist, aber in meinem Fall musste ich dies einmal tun und das vergessen, also ging ich einfach auf die Website von babel , transpilierte es6 zu es5 online und ersetzte die Ausgabe!

Gh111
quelle