UglifyJS выдает неожиданный токен: ключевое слово (const) с node_modules

90

В небольшом проекте, который я начал, используется модуль узла (установленный через npm ), который объявляет constпеременные. Запуск и тестирование этого проекта - это хорошо, но при выполнении UglifyJS происходит сбой просмотра.

Неожиданный токен: ключевое слово (const)

Вот общий файл Gulp, который я успешно использовал для нескольких других прошлых проектов без этой проблемы (то есть без этого конкретного модуля узла).

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

Я попытался исправить это, заменив все constна varв этом модуле, установленном npm, и все в порядке. Так что я не понимаю неудачи.

Что не так const? Если кто-то не использует IE10, все основные браузеры поддерживают этот синтаксис.

Есть ли способ исправить это, не требуя изменения этого модуля узла?

Обновить

Я временно (или навсегда) заменил UglifyJS на Butternut и, похоже, работает.

Яник Рочон
источник
Разве это не проблема с версией узла? Разве вам не нужно, чтобы был constдоступен узел 8+ ? (не уверен, когда он был на самом деле представлен)
laurent
Я использовал constтак v4. И сейчас я использую 8.9.1 LTS.
Яник Рочон
Хорошо, тогда это странно. Какое сообщение об ошибке вы видите?
laurent
@ this.lau_ то же сообщение об ошибке, что и в заголовке, но я также добавил его в вопрос для ясности.
Яник Рочон
Это не обязательно должно быть о константе. Это может быть один из необходимых вам модулей.
Джеймс

Ответы:

92

Как упоминалось ChrisR , UglifyJS не поддерживает ES6 вообще.

Вам необходимо использовать terser-webpack-plugin для ES6 (webpack @ 5 будет использовать этот плагин для углификации)

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

Затем определите в своем pluginsмассиве

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

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

Источник

Сер
источник
1
Может тебе стоит предложить npm install --save-dev terser-webpack-plugin.
Rafa
2
Я очень ценю этот ответ, потому что он напомнил мне о terserбиблиотеке, которая terser-webpack-pluginиспользуется ниже. Примечание для других: terserможно использовать автономно как cli, как и uglify-jsбыло (т.е. webpack не является требованием), что было именно тем, что мне было нужно.
John Lee
1
но нам нужно использовать веб-пакет, чтобы использовать это решение?
Enrique
@enrique зависит от того, чем вы хотите заниматься. Чтобы создать веб-сайт, соответствующий реальным бизнес-потребностям, вам обязательно стоит попробовать webpack. У нас была эта проблема в сообществе веб-пакетов, поэтому мой ответ хорошо оценен, но технически вам не нужен веб-пакет для создания кода ES6
Сер
Terser был вишней к WebPack @ 4 в github.com/webpack/webpack/pull/8392
Trivikram
39

UglifyJS не поддерживает es6. constявляется объявлением es6, поэтому выдает ошибку.

Что странно, так это то, что используемый вами пакет не переносит свои файлы в es5 для использования где угодно.

Если вы хотите по-прежнему использовать UglifyJS (например, для повторного использования конфигурации), используйте версию, совместимую с ES6 +, uglify-es . ( Внимание : uglify-esэто брошенные .)

И, как упомянул Сер , теперь вы должны использовать terser-webpack-plugin.

ChrisR
источник
3
Вы также можете заменить gulp-uglifyна gulp-uglify-es: npmjs.com/package/gulp-uglify-es
ChrisR
3
UglifyJS does not support es6 . Спасибо! Я нигде не мог найти эту информацию.
Karl Pokus
используйте, gulp-terserесли переход на webpack выходит за рамки вашего бюджета.
Riki137 07
7

У меня была такая же проблема, и плагин gulp gulp-uglify-es решил проблему.

Думаю, это самое простое решение.

Просто установите:

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

после этого в вашем коде измените только эту строку

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

к этому:

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

NB свойство .default имеет решающее значение, иначе вы получите ошибку, которая не является функцией uglify.

Как упоминалось выше и являясь частью оператора const ES6, может обрабатываться только более современным плагином es6 gulp "gulp-uglify-es"

Остальную часть кода изменять не нужно.

С уважением!

Кристиан
источник
протестирован и работает с "node: v12.14", "gulp cli v2.2.1", "gulp local v4.0.2".
ioojimooi,
2

У меня только что возникла проблема с проектом Gulp, который я реорганизовал, и по какой-то причине у меня возникли проблемы с официальным плагином Terser Gulp. Этот (gulp-terser) работал без проблем.

NetOperator Wibby
источник
0

Лучше использовать uglify-es-webpack-plugin

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



    module.exports = {
    plugins: [
            new UglifyEsPlugin({
                compress:{
                    drop_console: true
                }
            }),
    ] 
    }
НЕО ВИСИОН
источник
7
Это мнение, поясните, почему так лучше.
ChrisR
0

Я заменил его UglifyJSна YUI Compressor JSвнутри GUI PHPStorm .. Теперь он работает.

Sjoerd
источник
0

Я не думаю, что этот подход хорош, но в моем случае мне нужно было сделать это один раз и забыть об этом, поэтому я просто зашел на сайт babel , перекомпилировал es6 в es5 онлайн и заменил вывод!

Gh111
источник