【问题标题】:reusing stream pipeline/sub-pipeline in Node.js/Gulp在 Node.js/Gulp 中重用流管道/子管道
【发布时间】:2015-02-10 01:42:56
【问题描述】:

从流/gulp/vinyl 开始,并尝试使用stream-combiner2 清理/干燥我的 gulpfile。到目前为止它运行良好,除了现在我需要在另一个管道中运行一个子管道(简化的伪代码):

var logger = require("gulp-logger"),
HTMLPrettify = require("gulp-html-prettify"),
combiner = require("stream-combiner2"),
through = require("through2"),
tap = require("gulp-tap"),
_ = require("lodash");


preprocessPipeline = function() {
  return combiner.obj(getFrontMatter(), processTemplates());
};


gulp.task("build", ["clean"], function() {
    return gulp.src("in/**/*.html")
        .pipe(preprocessPipeline())
        .pipe(tap(function(file) {
            var data, dataSources;
            dataSources = getDataSources(file);
            data = {};

            /* PAUSE MAIN PIPELINE HERE */
            /* RUN THIS SUB PIPELINE BELOW */
            gulp.src(dataSources)
                .pipe(preprocessPipeline())
                .pipe(tap(function(file) {
                    _.merge(data, file.data);
                }));

            file.data = data;
            /* RESUME MAIN PIPELINE */
        }))
        .pipe(HTMLPrettify())
        .pipe(gulp.dest("out"));
});

如您所见,在主“构建”管道中,我尝试对主管道中的每个乙烯基文件对象执行以下操作:

  • 暂停执行主“构建”管道
  • 通过同步getDataSources()函数获取当前黑胶唱片的数据源路径
  • 使用另一个子管道来处理这些数据源路径,重用 preProccessPipeline 并最终合并它们的数据
  • 最后将来自数据源的合并数据添加到主管道中的乙烯基文件中,并在主管道中继续执行

gulp.src() 看起来像是将这些数据源文件加载到子管道中的完美方式,但主管道似乎在子管道启动之前完成。

另外,我开始意识到,也许我的管道看起来像同步函数流,很可能我错过了 stream/node.js 难题的关键部分。

帮助我重用管道但不使用子管道的相关文档:

相关问题:

谢谢。

【问题讨论】:

  • 请问这个gulp文件的目的是什么?你只是想构建你的源文件吗?如果是这样,那个构建步骤是什么样的?似乎您正在组合来自多个文件的数据,我不确定这是否完全有必要。我一直在大量使用 gulp / grunt 文件,以前从未见过这样的东西;除非我知道主要目标,否则帮不上什么忙
  • @KeenanLidral-Porter gulp 文件用于构建静态网站。正如我试图展示的主要模板文件需要为前端进行预处理,然后评估它们的模板,产生输出。模板文件还依赖于上下文的数据文件(例如包含)。这些数据文件还需要为前端进行预处理并评估模板,并且在处理模板之前不可能知道与模板文件关联的数据文件。因此,我试图为两种文件类型重用预处理子管道,但在同一个主管道中。谢谢

标签: javascript node.js stream gulp


【解决方案1】:

我发现stream-combiner 更直截了当

function coffeePipe() {
  return Combine(
    coffeescript(),
    coffeelint.reporter('fail')
  )
}
//usage:
gulp.src().pipe(coffeePipe());

【讨论】:

    【解决方案2】:

    似乎您正在使用 gulp 作为某种模板引擎——完全可行。

    Gulp 允许您指定哪些任务依赖于其他任务,因此您可以将该子管道分解为一个新任务,例如 "buildDataFiles",然后让您的构建任务依赖于该任务,即

    gulp.task("build", ["buildDataFiles", "clean"], function(){
    

    但是,正如您所说,这种方法的问题是,“在处理模板之前,不可能知道与模板文件关联的数据文件。”如果你确定没有办法解决这个问题,那就更棘手了。如果相反,您将主管道分解为 "processTemplate" 任务,然后 "build" 任务只处理子管道但依赖于 "processTemplate" 怎么办?它可能看起来像这样:

    gulp.task("processTemplate", ["clean"], function() {
      gulp.src("in/**/*.html")
        .pipe(preprocessPipeline())
        .pipe(gulp.dest("build/temp"));
    }
    
    gulp.task("build", ["processTemplate"], function() {
      gulp.src("build/temp/*.html")
        .pipe(tap(function(file) {
          var data, dataSources;
          dataSources = getDataSources(file);
          data = {};
    
          gulp.src(dataSources)
            .pipe(preprocessPipeline())
            .pipe(tap(function(file) {
              _.merge(data, file.data);
            }));
    
          file.data = data;
    
        }))
      .pipe(HTMLPrettify())
      .pipe(gulp.dest("out"));
    }
    

    看起来非常相似,但是您遇到的问题需要先处理模板,然后再处理数据文件。我会尝试查看gulp-consolidate,它可能会对您有所帮助。

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 1970-01-01
      • 2016-04-18
      • 1970-01-01
      • 1970-01-01
      • 2016-02-26
      • 2017-07-20
      • 2013-07-02
      • 2015-03-29
      相关资源
      最近更新 更多