如何用gulp-uglify缩小ES6功能?

wqnecbli  于 2022-12-08  发布在  Gulp
关注(0)|答案(9)|浏览(207)

当我运行gulp时,我得到以下错误:

[12:54:14] { [GulpUglifyError: unable to minify JavaScript]
cause:
{ [SyntaxError: Unexpected token: operator (>)]
 message: 'Unexpected token: operator (>)',
 filename: 'bundle.js',
 line: 3284,
 col: 46,
 pos: 126739 },
plugin: 'gulp-uglify',
fileName: 'C:\\servers\\vagrant\\workspace\\awesome\\web\\tool\\bundle.js',
showStack: false }

违规行包含箭头函数:

let zeroCount = numberArray.filter(v => v === 0).length

我知道我可以用下面的代码替换它,通过放弃ES6语法来纠正缩小错误:

let zeroCount = numberArray.filter(function(v) {return v === 0;}).length

如何通过gulp缩小包含ES6特性的代码?

6mw9ycah

6mw9ycah1#

您可以像这样利用gulp-babel...

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

gulp.task('minify', () => {
  return gulp.src('src/**/*.js')
    .pipe(babel({
      presets: ['es2015']
    }))
    .pipe(uglify())
    // [...]
});

这将使你的es6在流水线的早期就被传播,并在你缩小的时候大量生产出广泛支持的“普通”javascript。

可能需要注意-正如评论中指出的-核心Babel编译器在这个插件中作为peer dependency发行。如果核心库没有通过你的repo中的另一个dep被下载,确保它安装在你的一端。

查看gulp-babel中的对等依赖项,作者指定了@babel/core(7.x)。不过,稍旧的babel-core(6.x)也会起作用。我的猜测是作者(对于两个项目来说是同一个人)正在重新组织他们的模块命名。所以您可以选择以下任何一种方式...

npm install babel-core --save-dev

npm install @babel/core --save-dev
pprl5pva

pprl5pva2#

公认的答案并没有 * 真正 * 回答如何缩小直es6。如果你想缩小es6而不蒸发,gulp-uglify v3.0.0使之成为可能:

2019年3月更新

使用我最初的答案,您肯定希望用terser替换uglify-es包,因为似乎不再维护uglify-es。

原始答案,仍然有效:

1.)首先,升级你的gulp-uglify包到〉3.0.0如果你正在使用yarn并且想更新到最新版本:

yarn upgrade gulp-uglify --latest

2.)现在您可以使用uglify-es(uglify的“es6版本”),如下所示:

const uglifyes = require('uglify-es');
const composer = require('gulp-uglify/composer');
const uglify = composer(uglifyes, console);

gulp.task('compress', function () {
    return gulp.src('src/*.js')
    .pipe(uglify())
    .pipe(gulp.dest('dist'))
});

如需更多信息:https://www.npmjs.com/package/gulp-uglify

fnvucqvd

fnvucqvd3#

你实际上可以在不需要翻译的情况下丑化ES6代码。使用gulp-uglifyes插件代替gulp-uglify插件。

var gulp = require('gulp');
var rename = require('gulp-rename'); 
var uglify = require('gulp-uglifyes');
var plumber = require('gulp-plumber');
var plumberNotifier = require('gulp-plumber-notifier');
var sourcemaps = require('gulp-sourcemaps');
var runSequence = require('run-sequence').use(gulp);

gulp.task('minjs', function () {
  return gulp.src(['/dist/**/*.js', '!/dist/**/*.min.js'])
    .pipe(plumberNotifier())
    .pipe(sourcemaps.init())
    .pipe(uglify({ 
       mangle: false, 
       ecma: 6 
    }))
    .pipe(rename(function (path) {
      path.extname = '.min.js';
    }))
    .pipe(sourcemaps.write('.'))
    .pipe(gulp.dest('/dist'));
});
eoxn13cs

eoxn13cs4#

吞下丑化
适用于ES6及更新版本。

1.安装:npm install --save-dev gulp-uglify
1.安装:npm install --save-dev gulp-babel @babel/core @babel/preset-env

用法:

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

gulp.task('script', () => {
    return gulp.src('src/**/*.js')
        .pipe(babel({
            presets: ['@babel/env']
        }))
        .pipe(uglify())
        .pipe(gulp.dest('src/dist'))
});
tgabmvqs

tgabmvqs5#

我花了一段时间才让它开始工作。正如其他答案所指出的,问题是 gulp-uglify 不支持ES6。gulp-uglify-es 支持,但不再维护。Terser 是其他人推荐的,但它不适合gulp和pipe()
如果你像我一样使用 gulp-uglify,你的gulpfile.js看起来像这样:

var uglify = require('gulp-uglify');
const html2js = () => {
     var source = gulp.src(config.appFiles.templates);
    return source
        .pipe(concat('templates-app.js'))
        .pipe(uglify())
        .pipe(gulp.dest(config.buildDir));
};

但是,您可以使用 gulp-terser 包,它非常容易替换,并获得相同的功能:

var terser = require('gulp-terser');
const html2js = () => {
     var source = gulp.src(config.appFiles.templates);
    return source
        .pipe(concat('templates-app.js'))
        .pipe(terser())
        .pipe(gulp.dest(config.buildDir));
};
lmvvr0a8

lmvvr0a86#

使用gulp-uglify-es而不是gulp-uglify帮助我完美地完成了您所要求的任务

tquggr8v

tquggr8v7#

目前(2021年11月)最简单的方法是使用gulp-terser
如果你已经在使用gulp-uglify,那么只需安装gulp-terser,并将“uglify”改为“terser”,你就完成了。

const uglifyes = require('terser');

gulp.task('compress', function () {
    return gulp.src('src/*.js')
    .pipe(terser())
    .pipe(gulp.dest('dist'))
});
xxslljrj

xxslljrj8#

不幸是,现在您不能将uglifyes-next代码一起使用,您可以:
1.使用Babel传输到ES5
1.使用Babili代替 Uglify

z9zf31ra

z9zf31ra9#

module.exports = {
  ...
  optimization: {
    minimize: true
  },
  ...
}

Webpack可以完成这项工作

相关问题