使用 Gulp 时捕获和处理 Uglify 错误

Catching and handling Uglify errors when using Gulp

我的 Gulp 设置在其他方面运行得非常好,但如果我的 JS 文件出现错误,它就会停止。在 Gulp 4 最终发布之前,我们都在使用 Gulp 中不太完美的错误系统...那么我如何捕捉 Uglify 的错误?

gulp.task('js', function() {
    return gulp
        .src(inputJS)
        .pipe(sourcemaps.init())
        .pipe(concat('main.js'))
        .pipe(uglify(uglifyOptions))
        .pipe(sourcemaps.write('./maps'))
        .pipe(gulp.dest(outputJS))
});

根据 Uglify documentation,如果 gulp-uglify 无法缩小特定文件,则会发出 'error' 事件。只要有可能,PluginError 对象将包含以下属性:fileNamelineNumbermessage.

我最接近它工作的是:.on('error', function(uglify) { console.error(uglify.message) })),但它最终停止执行上述 Gulp 任务。

编辑:我知道有许多 Gulp 扩展可以帮助处理错误(例如 Gulp-Util, Stream-Combiner2, Gulp-Plumber 等),但我不想安装全新的仅用于 Uglify 的扩展(我正在处理我的 Sass 错误,没有一个错误)。

也许gulp-plumber会有所帮助。

var plumber = require('gulp-plumber');

gulp.task('js', function() {
    return gulp
        .src(inputJS)
        .pipe(plumber(function(error) {
            console.error(error.message);
            gulp.emit('finish');
        }))
        .pipe(sourcemaps.init())
        .pipe(concat('main.js'))
        .pipe(uglify(uglifyOptions))
        .pipe(sourcemaps.write('./maps'))
        .pipe(gulp.dest(outputJS))
});

那应该捕获任何发出的错误并将它们写入控制台。

看起来解决方案很简单:

    .pipe(uglify(uglifyOptions).on('error', function(uglify) {
        console.error(uglify.message);
        this.emit('end');
    }))

几乎完全符合 Jeffwa 的建议,但不需要 gulp-plumber。我的尝试停止的原因是 Gulp watch 任务等到它们收到 end(参见:https://github.com/gulpjs/gulp/issues/259)。