2015-02-10 1 views
4

У меня есть проект с несколькими относительно непересекающимися страницами, каждый из которых содержит собственный скрипт точки входа. Эти скрипты require ряд других, использующих синтаксис commonjs, и должны быть преобразованы с помощью 6to5 и в комплекте с помощью браузера.Chain Gulp glob, чтобы прояснить преобразование

Я хотел бы настроить задачу gulp, которая захватывает все файлы, соответствующие шаблону, и передает их на соединитель, но я не уверен, как передавать файлы с gulp.src на browserify(filename).

Мой gulpfile выглядит следующим образом:

var gulp = require("gulp"); 
var browserify = require("browserify"); 
var to5browserify = require("6to5-browserify"); 
var source = require("vinyl-source-stream"); 

var BUNDLES = [ 
    "build.js", 
    "export.js", 
    "main.js" 
]; 

gulp.task("bundle", function() { 
    /* Old version, using glob: 
    return gulp.src("src/** /*.js") 
     .pipe(sixto5()) 
     .pipe(gulp.dest("dist")); 
    */ 

    // New version, using array: 
    return BUNDLES.map(function (bundle) { 
     return browserify("./src/" + bundle, {debug: true}) 
      .transform(to5browserify) 
      .bundle() 
      .pipe(source(bundle)) 
      .pipe(gulp.dest("./dist")); 
    }); 
}); 

gulp.task("scripts", ["bundle"]); 

gulp.task("html", function() { 
    return gulp.src("src/**/*.html") 
     .pipe(gulp.dest("dist")); 
}); 

gulp.task("styles", function() { 
    return gulp.src("src/**/*.css") 
     .pipe(gulp.dest("dist")); 
}); 

gulp.task("default", ["scripts", "html", "styles"]); 

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

Я пробовал использовать gulp.src(glob).pipe в окне вызова и вызова после вызова (shown here) и gulp.src(glob).map (метод не существует).

Как вы можете связать gulp.src с трансформатором, основанным на имени, как и для браузера?

ответ

7

Использование through2 сделать разовый заказ плагин поток, который делает всю грязную работу.

Неудачно vinyl-transform и vinyl-source-stream и решения, которые идут вместе с ними, имеют недостатки, поэтому нам нужно идти на что-то обычай.

var gulp = require('gulp'); 
var through = require('through2'); 
var browserify = require('browserify'); 

gulp.task('bundle', function() { 
    var browserified = function() { 
     return through.obj(function(chunk, enc, callback) { 
      if(chunk.isBuffer()) { 
       var b = browserify(chunk.path); 
        // Any custom browserify stuff should go here 
        //.transform(to5browserify); 

       chunk.contents = b.bundle(); 

       this.push(chunk); 

      } 
      callback(); 
     }); 
    }; 

    return gulp.src(['./src/**/*.js']) 
     .pipe(browserified()) 
     .pipe(gulp.dest('dest')); 
}); 
+0

Это кажется ужасно близким, но у меня проблема с участием 6to5. Используя ваш код, но добавляя вызов '.transform()' перед '.bundle()' вызывает ошибку «write after end». Я попытался добавить параметр '{read: false}' к вызову 'gulp.src', но это привело к тому, что мой dist-каталог был пустым. – ssube

+0

Использование 'pipe (through.obj())' избавляется от ошибки «write after end», но выходной файл просматривается *, но не 6to5-ified *. – ssube

+0

После редактирования (и некоторое время, проведенное в чате) это, похоже, решило проблему. Это похоже на немного взлома, но, похоже, хорошо работает (локально и в CI). – ssube

-2

Вы можете указать в вашей шарики массива BUNDLES, а также исключить любые файлы:

var BUNDLES = [ 
    "app/**/*.js", 
    "export.js", 
    "app/modules/**/*.js", 
    "!app/modules/excluded/*.js" 
]; 
+0

Это просто вызывает ошибку 'Не удается найти модуль 'src/**/*. Js'', когда он встречает glob на пути в браузере. – ssube

 Смежные вопросы

  • Нет связанных вопросов^_^