Подтвердить что ты не робот

Как выводить несколько пакетов с помощью браузера и gulp

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

Я хотел бы получить 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"));

});

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

4b9b3361

Ответ 1

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

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"]);
});

Ответ 2

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

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

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

config.bundleConfigs.forEach(browserifyThis);

browserifyThis берет объект bundleConfig и запускает браузер (с проверкой, если режим 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)

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

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

Ответ 3

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 может быть проще и не требует подчеркивания.

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