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.