UglifyJS 抛出意外标记:关键字(常量)与 node_modules

UglifyJS throws unexpected token: keyword (const) with node_modules

我开始的一个小项目使用声明 const 变量的节点模块(通过 npm 安装)。 运行 测试这个项目很好,但是执行 UglifyJS 时 browserify 失败了。

Unexpected token: keyword (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))
  ;
});

我尝试通过将 npm 安装模块中的所有 const 替换为 var 来修复此问题,一切正常。所以我不明白失败。

const 怎么了?除非有人使用 IE10,所有 主流浏览器都支持这种语法。

有没有无需更改该节点模块即可解决此问题的方法?

更新

我暂时(或永久)用 Butternut 替换了 UglifyJS 并且似乎可以工作。

UglifyJS 不支持 es6。 const 是一个 es6 声明,所以会抛出一个错误。

奇怪的是,您使用的包不会将其文件转换为 es5 以便在任何地方使用。

如果您仍想使用 UglifyJS(例如重新使用配置),请使用 ES6+ 兼容版本,uglify-es. (Warning: uglify-es is now abandoned。)

一样,您现在应该使用 terser-webpack-plugin

一样,UglifyJS完全不支持ES6

ES6需要使用terser-webpack-plugin(webpack@5会使用该插件进行丑化)

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

然后在你的plugins数组中定义

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

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

Source

使用 uglify-es-webpack-plugin 更好

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



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

我在 PHPStorm 的 GUI 中将 UglifyJS 替换为 YUI Compressor JS。现在可以使用了。

我刚重构的 Gulp 项目遇到了这个问题,由于某种原因,我在使用官方 Terser Gulp 插件时遇到了问题。 This one (gulp-terser) 没有任何问题。

我真的不认为这种方法很好,但在我的情况下我需要这样做一次然后忘记那个,所以我只是去了 babel's website ,在线将 es6 转换为 es5 并替换输出!

我遇到了同样的问题,gulp 插件 gulp-uglify-es 解决了这个问题。

我认为这是最简单的决定。

只需安装:

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

之后在您的代码中只更改这一行

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

对此:

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

N.B。 属性 .default 是至关重要的,否则你会得到一个错误,即 uglify 不是一个函数。

如上所述并且作为 ES6 的一部分 const 运算符只能由更现代的 es6 gulp 插件处理 "gulp-uglify-es"

其余代码无需更改。

此致!