【问题标题】:How can I get browserify's "bundle" function to emit an end event?如何让 browserify 的“捆绑”功能发出结束事件?
【发布时间】:2016-01-12 20:02:31
【问题描述】:

假设我有一些相对通用的 browserify 脚手架,打算与 gulp 一起使用:

var browserSync = require('browser-sync').create();
var browserify  = require('browserify');
var gutil = require('gulp-util');
var exorcist = require('exorcist');

var bundler = browserify('app.jsx', {
  debug: false,
  extensions: ['.jsx'],
  cache: {},
  packageCache: {}
});

function bundle() {
  return bundler.bundle()
    .on('error', function(err) {
        gutil.log(err.message);
        browserSync.notify('Browserify error!');
        this.emit('end');
    })
    .pipe(source('app.js'))
    .pipe(transform(function () {
      return exorcist('public/js/app.js.map');
    }))
    .pipe(gulp.dest('public/js'))
    .pipe(browserSync.stream({ once: true }))
}

我的问题是 gulp 4 需要明确通知任务完成,而上面的 bundle() 没有提供:

gulp.task('js', function(callback) {
  return bundle();
})

Gulp 4 输出:

[timestamp] The following tasks did not complete: js

[timestamp] Did you forget to signal async completion?

但是,bundle() 不会自行发出“结束”事件,所以下面会出现同样的错误:

gulp.task('js', function(callback) {
  bundle().on('end', callback);
});

如何让这个函数在最后一次.pipe() 调用之后发出“结束”事件,或者让 gulp 4 识别任务已完成according to the API docs

【问题讨论】:

    标签: javascript node.js gulp browserify browser-sync


    【解决方案1】:

    您面临的问题是传递callback,而不是调用它。如果callback 未定义,您需要做的就是返回一个流。

    以下应该可以解决问题:

    gulp.task('js', function () { return bundle(); });
    

    应该这样:

    gulp.task('js', function (cb) { bundle().on('end', cb); });
    

    您可以返回调用回调,不要将两者混为一谈。

    我在这里可能是错的,但我认为一般建议是返回。

    【讨论】:

      【解决方案2】:

      我不知道根本问题是什么,但是移除管道中的驱魔人线可以解决我的问题。

      【讨论】:

        猜你喜欢
        • 2019-06-07
        • 1970-01-01
        • 2017-12-21
        • 1970-01-01
        • 1970-01-01
        • 2018-01-07
        • 2016-03-28
        • 2011-03-06
        • 2021-07-25
        相关资源
        最近更新 更多