【问题标题】:gulp: blanking output if Browserify failsgulp:如果 Browserify 失败,则输出空白
【发布时间】:2014-07-28 06:08:37
【问题描述】:

我在我的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(或插入 alert("ERROR");),而不是只在终端中报告错误。

由于我假设是一种竞争条件(管道结论覆盖“错误”事件处理程序中的文件操作),我尝试实现这一点失败了,因此我将不胜感激有关如何正确执行此操作的一些建议。

【问题讨论】:

    标签: gulp browserify


    【解决方案1】:

    如果您认为您的问题是由于代码的异步性引起的,您可以使用asyncq 来指定代码执行的顺序(例如,尝试async.waterfall)。

    【讨论】:

    • 老实说,我并不完全了解 Gulp 的流是如何工作的 - 所以我不确定 Promise 究竟有什么帮助。
    • 看这篇文章,我相信他正在使用through来控制串行执行:unobfuscated.blogspot.com/2014/01/…
    • 恐怕我不明白这有什么帮助,因为我需要对在 Gulp 任务流之外运行的 Browserify 的错误事件做出反应。
    • end 事件中启动 gulp 管道 - 如果你没有达到它(error 发生),你将不会进步。
    【解决方案2】:

    如果你想在出错时清空文件,你可以编写一个 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'));
    

    然后你会得到一个空文件而不是处理过的文件。当然,您可以修改它以将错误信息写入文件,或者做任何事情。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 2019-04-13
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      相关资源
      最近更新 更多