使用 Through2 从乙烯基流创建多个文件

Creating multiple files from Vinyl stream with Through2

我一直在尝试自己解决这个问题,但还没有成功。我什至不知道如何开始研究这个(虽然我已经尝试了一些 Google 搜索,但无济于事),所以我决定在这里问这个问题。

是否可以从 Through2 Object Stream return 多个 Vinyl 文件?

我的用例是这样的:我通过流接收一个 HTML 文件。我想将文件的两个不同部分(使用 jQuery)和 return 隔离在两个单独的 HTML 文件中。我可以用一个部分(和一个结果 HTML 文件)来完成,但我完全不知道如何生成两个不同的文件。

有人可以帮我吗? 提前致谢。

基本方法是这样的:

  1. 使用 clone() 函数根据需要从输入文件创建尽可能多的输出文件。

  2. 修改.contents property of each file depending on what you want to do. Don't forget that this is a Buffer,不是字符串。

  3. 修改 .path property of each file so your files don't overwrite each other. This is an absolute path so use something like path.parse() and path.join() 使事情变得更简单。

  4. through2 transform function 中为您创建的每个文件调用 this.push()

这是一个将文件 test.txt 拆分为两个同样大的文件 test1.txttest2.txt 的简单示例:

var gulp = require('gulp');
var through = require('through2').obj;
var path = require('path');

gulp.task('default', function () {
  return gulp.src('test.txt')
    .pipe(through(function(file, enc, cb) {
       var c = file.contents.toString();
       var f = path.parse(file.path);
       var file1 = file.clone();
       var file2 = file.clone();
       file1.contents = new Buffer(c.substring(0, c.length / 2));
       file2.contents = new Buffer(c.substring(c.length / 2));
       file1.path = path.join(f.dir, f.name + '1' + f.ext);
       file2.path = path.join(f.dir, f.name + '2' + f.ext);
       this.push(file1);
       this.push(file2);
       cb();
    }))
    .pipe(gulp.dest('out'));
});