it-swarm.com.ru

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

Небольшой проект, который я начал, использует модуль узла (установленный через npm), который объявляет переменные const. Запуск и тестирование этого проекта хорошо, но browserify не удается, когда выполняется 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 и, похоже, работает.

24
Yanick Rochon

Ноябрь 2018 обновление:

Используйте 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,
    },
  }),

Источник

21
Ser

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

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

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

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

16
ChrisR

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

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



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