gulp:如果Browserify失败,则清空输出

gulp:如果Browserify失败,则清空输出,gulp,browserify,Gulp,Browserify,我在我的gulpfile.js中使用了Browserify,如下所示: browserify("src/main.js").bundle() .on("end", function() { console.log("compiled JavaScript via Browserify"); }) .on("error", function(err) { console.warn("ERROR: Browserify failed", err

我在我的
gulpfile.js中使用了Browserify,如下所示:

browserify("src/main.js").bundle()
    .on("end", function() {
        console.log("compiled JavaScript via Browserify");
    })
    .on("error", function(err) {
        console.warn("ERROR: Browserify failed", err);
    })
    .pipe(source("bundle.js"))
    .pipe(gulp.dest("./dist"));
但是,很容易忽略编译错误-因此我更喜欢空白
dist/bundle.js
(或者插入
警报(“错误”);
),而不是只在终端中报告错误


我尝试实现这一点失败了,因为我假设这是一个争用条件(管道结论覆盖“错误”事件处理程序中的文件操作),因此我非常感谢您就如何正确实现这一点提供一些建议。

如果您认为您的问题是由于代码的异步性造成的,您可以使用或指定代码的执行顺序(例如,尝试
async.falter

如果您想在出错时清空文件,您可以编写一个gulp流处理程序,处理流中生成的控制结构并清空文件,否则只需将其传递。以下是处理程序的代码:

var through2 = require('through2');
var gutil = require('gulp-util');

var blank = function () {
    var blank = false;
    return through2.obj(
        function (file, encoding, cb) {
            if (!file.control && !blank) {
                this.push(file);
            } else if (file.control) {
                blank = true;
            } else if (file.path && blank) {
                var newFile = new gutil.File({
                  base: file.base,
                  cwd: file.cwd,
                  path: file.path,
                  contents: new Buffer('')
                });
                this.push(newFile);
            }
            cb();
        }, function (cb) {
            cb();
        });
};
然后您需要捕获错误并生成一个控制结构。可以这样做,在
on(“error”
处理程序中,放置以下代码行:

this.push({"control": "failed"});

如果在输出之前将空白处理程序设置为流中的最后一个处理程序,则如下所示:

    .pipe(blank())
    .pipe(gulp.dest('./dist'));
然后,您将有一个空文件,而不是已处理的文件。当然,您可以修改此文件,将错误信息写入该文件,或者执行任何操作


话虽如此,为什么在遇到此错误时不希望处理停止?任何未经处理的流错误都应该停止处理。

老实说,我不完全理解Gulp的流是如何工作的-因此我不确定承诺到底会有什么帮助。看看这篇文章,我相信他正在通过
来控制ol串行执行:恐怕我不明白这会有什么帮助,因为我需要对Browserify的错误事件做出反应,该事件在吞咽任务流之外运行。在
end
事件中启动吞咽管道-如果你没有到达它(
错误发生),你将无法继续。