使用 Through2 从 Vinyl 流创建多个文件

Dan*_*tos 2 node.js gulp through2

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

是否可以从 Through2 对象流返回多个 Vinyl 文件?

我的用例是这样的:我通过流接收一个 HTML 文件。我想隔离文件的两个不同部分(使用 jQuery)并将它们返回到两个单独的 HTML 文件中。我可以使用单个部分(以及单个生成的 HTML 文件)来完成此操作,但我完全不知道如何生成两个不同的文件。

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

Sve*_*ung 5

基本方法是这样的:

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

  2. .contents根据您想要执行的操作修改每个文件的属性。不要忘记这是一个Buffer,而不是 String 。

  3. 修改.path每个文件的属性,以便您的文件不会相互覆盖。这是绝对路径,因此使用类似path.parse()和 的东西path.join()可以让事情变得更容易。

  4. this.push()从您创建的每个文件的through2转换函数中调用。

这是一个简单的示例,它将一个文件拆分test.txt为两个同样大的文件test1.txt并且test2.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'));
});
Run Code Online (Sandbox Code Playgroud)