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

时间:2016-04-26 15:12:20

标签: node.js gulp through2

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

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

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

有人能帮我一把吗? 提前谢谢。

1 个答案:

答案 0 :(得分:3)

基本方法是这样的:

  1. 使用clone()功能根据需要从输入文件中创建任意数量的输出文件。

  2. 根据您要执行的操作修改每个文件的.contents属性。别忘了这是Buffer,而不是字符串。

  3. 修改每个文件的.path属性,这样您的文件就不会互相覆盖。这是一个绝对路径,因此请使用path.parse()path.join()等内容来简化操作。

  4. through2 transform function内为您创建的每个文件致电this.push()

  5. 以下是将文件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'));
    });