как вывести несколько пакетов с browserify и gulp

у меня есть browserify, связывающий файлы, и он отлично работает. Но что если мне нужно создать несколько комплектов?

Я хотел бы закончить с dist/appBundle.js и dist/publicBundle.js

gulp.task("js", function(){

    return browserify([
            "./js/app.js",
            "./js/public.js"
        ])
        .bundle()
        .pipe(source("bundle.js"))
        .pipe(gulp.dest("./dist"));

});

очевидно, что это не сработает, так как я указываю только один выход (bundle.в JS). Я могу сделать это, повторяя приведенное выше утверждение так (но это не кажется правильным из-за повторения):

gulp.task("js", function(){

    browserify([
            "./js/app.js"
        ])
        .bundle()
        .pipe(source("appBundle.js"))
        .pipe(gulp.dest("./dist"));


    browserify([
            "./js/public.js"
        ])
        .bundle()
        .pipe(source("publicBundle.js"))
        .pipe(gulp.dest("./dist"));

});

есть ли лучший способ справиться с этой проблемой? Спасибо!

3 ответов


у меня нет хорошей среды для тестирования этого прямо сейчас, но я предполагаю, что это будет выглядеть примерно так:

gulp.task("js", function(){
    var destDir = "./dist";

    return browserify([
        "./js/app.js",
        "./js/public.js"
    ])
        .bundle()
        .pipe(source("appBundle.js"))
        .pipe(gulp.dest(destDir))
        .pipe(rename("publicBundle.js"))
        .pipe(gulp.dest(destDir));

});

EDIT: я только что понял, что неправильно прочитал вопрос, должно быть два отдельных пакета, исходящих из двух отдельных .файлы js. В свете этого лучшая альтернатива, которую я могу придумать, выглядит так:

gulp.task("js", function(){
    var destDir = "./dist";

    var bundleThis = function(srcArray) {
        _.each(srcArray, function(source) {
            var bundle = browserify(["./js/" + source + ".js"]).bundle();
            bundle.pipe(source(source + "Bundle.js"))
                  .pipe(gulp.dest(destDir));
        });
    };

    bundleThis(["app", "public"]);
});

несколько пакетов с общими зависимостями

недавно я добавил поддержку нескольких пакетов с общими зависимостями в https://github.com/greypants/gulp-starter

вот массив browserify конфигурация объектов Я перехожу к моему задач browserify. В конце этой задачи, я перебирать каждый файл конфигурации, browserifying все вещи.

config.bundleConfigs.forEach(browserifyThis);

browserifyThis принимает объект bundleConfig и запускает browserify (с watchify, если режим dev).

Это бит, который сортирует общие зависимости:

// Sort out shared dependencies.
// b.require exposes modules externally
if(bundleConfig.require) b.require(bundleConfig.require)
// b.external excludes modules from the bundle, and expects
// they'll be available externally
if(bundleConfig.external) b.external(bundleConfig.external)

эта задача browserify также правильно отчеты, когда все пакеты закончены (приведенный выше пример не возвращает потоки или не запускает обратный вызов задачи) и использует watchify когда в devMode для супер быстрых перекомпиляций.

последнее замечание Брайана Фитцджеральда-это место. Помните, что это просто JavaScript!


gulp.task("js", function (done) {
  [
    "app",
    "public",
  ].forEach(function (entry, i, entries) {
    // Count remaining bundling operations to track
    // when to call done(). Could alternatively use
    // merge-stream and return its output.
    entries.remaining = entries.remaining || entries.length;

    browserify('./js/' + entry + '.js')
      .bundle()
      // If you need to use gulp plugins after bundling then you can
      // pipe to vinyl-source-stream then gulp.dest() here instead
      .pipe(
        require('fs').createWriteStream('./dist/' + entry + 'Bundle.js')
        .on('finish', function () {
          if (! --entries.remaining) done();
        })
      );
  });
});

это похоже на ответ @urban_racoons, но с некоторыми улучшениями:

  • этот ответ потерпит неудачу, как только вы хотите, чтобы задача была зависимостью от другой задачи в gulp 3 или частью серии в gulp 4. Этот ответ использует обратный вызов для сигнала завершения задачи.
  • JS может быть проще и не требует подчеркивания.

этот ответ основан на предпосылке наличия известного списка файлов ввода для каждого пакета, в отличие от чтобы, скажем, собрать список входных файлов.