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 і, здається, працює.


Чи не проблема у версії вузла? Вам не потрібен, як вузол 8+, щоб мати його в constнаявності? (не впевнений, коли він був фактично введений)
— Лоран

Я використовую constз v4. І зараз я використовую 8.9.1 LTS.
— Янік Рошон,

Гаразд, це дивно тоді. Яке повідомлення про помилку ви бачите?
— Лоран,

@ this.lau_ те саме повідомлення про помилку, що і в заголовку, але я також додав його у запитання для ясності.
— Янік Рошон

Це не обов'язково повинно бути про "const". Це може бути один із модулів, який вам потрібен.
— Джеймс

Відповіді:


92

Як згадував ChrisR , UglifyJS взагалі не підтримує ES6.

Вам потрібно використовувати плагін terser-webpack для 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.
— Рафа

2
Я дуже ціную цю відповідь, оскільки вона нагадала мені про terserбібліотеку, яка terser-webpack-pluginвикористовується внизу. Примітка для інших: terserможна використовувати автономно як кліп, як і uglify-jsбуло (тобто веб-пакет не є вимогою), що було саме тим, що мені потрібно.
— Джон Лі,

1
але нам потрібно використовувати webpack для використання цього рішення?
— Енріке

@enrique залежить від того, що ви хочете зробити, щоб створити веб-сайт, який відповідає реальним бізнес-потребам, вам неодмінно слід спробувати створити веб-пакет. У нас виникла ця проблема у спільноті webpack, тому моя відповідь добре оцінена, але технічно вам не потрібен 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.


3
Ви також можете замінити gulp-uglifyна gulp-uglify-es: npmjs.com/package/gulp-uglify-es
— ChrisR

3
UglifyJS does not support es6 . Дякую! Я ніде не міг знайти цю інформацію.
— Карл Покус,

використовувати, gulp-terserякщо перехід на webpack не з вашого бюджету.
— Riki137

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) працював без проблем.


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внутрішній графічний інтерфейс PHPStorm .. Він працює зараз.


0

Я насправді не вважаю, що такий підхід хороший, але в моєму випадку мені потрібно було зробити це один раз і забути про це, тому я просто зайшов на веб-сайт Babel, переклав es6 на es5 в Інтернеті і замінив результат!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.