92 votes

UglifyJS rejette un token inattendu : mot-clé (const) avec node_modules

Un petit projet que j'ai commencé à faire utiliser un module node (installé via npm ) qui déclare const variables. L'exécution et le test de ce projet se passe bien, mais browserify échoue lorsque UglifyJS est exécuté.

Unxpected token : mot-clé (const)

Voici un fichier Gulp générique que j'ai utilisé avec succès pour quelques autres projets passés sans ce problème (c'est-à-dire sans ce module node particulier).

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

J'ai essayé de résoudre ce problème en remplaçant tous les const a var dans ce module installé par npm, et tout va bien. Je ne comprends donc pas l'échec.

Quel est le problème avec const ? Sauf si quelqu'un utilise IE10, todo Les principaux navigateurs prennent en charge cette syntaxe.

Existe-t-il un moyen de résoudre ce problème sans avoir à modifier le module du nœud ?

Mise à jour

J'ai remplacé temporairement (ou définitivement) UglifyJS par Butternut et semblent fonctionner.

0 votes

N'est-ce pas un problème avec la version du nœud ? N'avez-vous pas besoin de la version 8+ de node pour avoir const disponible ? (je ne sais pas quand il a été introduit)

0 votes

J'ai utilisé const depuis la version 4. Et j'utilise actuellement la version 8.9.1 LTS.

0 votes

Ok, c'est étrange alors. Quel est le message d'erreur que vous voyez ?

96voto

Ser Points 51

Comme ChrisR a mentionné UglifyJS ne supporte pas du tout ES6.

Vous devez utiliser terser-webpack-plugin pour ES6 (webpack@5 utilisera ce plugin pour l'uglification)

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

Ensuite, définissez dans votre plugins tableau

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

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

Source :

1 votes

Vous devriez peut-être suggérer npm install --save-dev terser-webpack-plugin .

2 votes

J'apprécie vraiment cette réponse parce qu'elle me rappelle le terser lib que terser-webpack-plugin utilise en dessous. Note pour les autres : terser peut être utilisé de manière autonome comme cli tout comme uglify-js était (c'est-à-dire que webpack n'est pas une obligation), ce qui était exactement ce dont j'avais besoin.

1 votes

Mais nous devons utiliser webpack pour utiliser cette solution ?

42voto

ChrisR Points 2484

UglifyJS ne supporte pas es6. const est une déclaration es6, ce qui entraîne une erreur.

Ce qui est bizarre, c'est que le paquet que vous utilisez ne transpile pas ses fichiers en es5 pour être utilisé n'importe où.

Si vous voulez continuer à utiliser UglifyJS (pour réutiliser la configuration par exemple), utilisez la version compatible ES6+, uglify-es . ( Avertissement : uglify-es es maintenant abandonné .)

Et comme Série mentionnée vous devez maintenant utiliser terser-webpack-plugin .

3 votes

Vous pouvez également remplacer gulp-uglify par gulp-uglify-es : npmjs.com/package/gulp-uglify-es

4 votes

UglifyJS does not support es6 . Merci ! Je n'ai trouvé cette information nulle part.

0 votes

Utiliser gulp-terser si la migration vers webpack est hors de votre budget.

2voto

NetOperator Wibby Points 163

Je viens d'avoir ce problème avec un projet Gulp que j'ai remanié et pour une raison quelconque, j'avais des difficultés avec le plugin Gulp officiel de Terser. Celui-là (gulp-terser) a fonctionné sans problème.

0voto

Sjoerd Points 1

J'ai remplacé UglifyJS con YUI Compressor JS dans le GUI de PHPStorm Cela fonctionne maintenant.

-1voto

NEO ViSiON Points 1

Utiliser uglify-es-webpack-plugin est mieux

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

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

8 votes

Il s'agit d'une opinion, veuillez expliquer pourquoi elle est meilleure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X