Javascript 如何编写一个简单的gulppipe函数?

Javascript 如何编写一个简单的gulppipe函数?,javascript,node.js,gulp,Javascript,Node.js,Gulp,我已经试着写了一天的两个管道函数,一个编译更少的文件,另一个连接这些文件。我想学习如何为更复杂的插件编写转换流/管道 所以我想知道如何从另一个管道读取数据,以及如何更改该数据并将其发送到下一个管道。这就是我到目前为止所做的: gulp.src(sources) .pipe(through.obj(function (chunk, enc, cb) { var t = this; // console.log("chunk", chunk.path); fs

我已经试着写了一天的两个管道函数,一个编译更少的文件,另一个连接这些文件。我想学习如何为更复杂的插件编写转换流/管道

所以我想知道如何从另一个管道读取数据,以及如何更改该数据并将其发送到下一个管道。这就是我到目前为止所做的:

 gulp.src(sources)
   .pipe(through.obj(function (chunk, enc, cb) {

     var t = this;
     // console.log("chunk", chunk.path);
     fs.readFile(chunk.path, enc, function (err,data) {
       if (err) { cb(err); }

       less.render(data, {
         filename : chunk.path,
         sourceMap : {
           sourceMapRootpath : true
         }
       })
       .then(function (outputCss) {
          // console.log("less result",outputCss);
          t.push(chunk);// or this.push(outputCss) same result
          cb();
       });

     });

   }))
   .pipe(through.obj(function (chunk, enc, cb) {
     console.log("chunk", chunk.path); // not event getting called.
     cb();
   }))

我无法为第二个管道中的每个文件获取
输出css
。我如何发送它?

好吧,您不需要在这里使用
fs
,您已经获得了文件流(这里是您的

还有一点,您没有将文件发送回管道,所以我想这就是为什么在第二个管道上不调用任何内容的原因

const through = require('through2')

gulp.src(sources)
  .pipe(through.obj((chunk, enc, cb) => {
    console.log('chunk', chunk.path) // this should log now
    cb(null, chunk)
  }))
2015年欧洲标准:

import through from 'through2'

gulp.src(sources)
  .pipe(through.obj((chunk, enc, cb) => cb(null, chunk)))
对于您的具体示例:

.pipe(through.obj((file, enc, cb) => {
  less.render(file.contents, { filename: file.path, ... }) // add other options
    .then((res) => {
      file.contents = new Buffer(res.css)
      cb(null, file)
    })
}))

这仍然是非常基本的,我不检查错误,如果它不是流等等,但这应该会给你一些提示,说明你错过了什么。

@vsync Simple in gulp,在不同的情况下可能更容易languages@vsync,您是否在使用其他内容而不是通过来执行此操作?如果是这样,请写一个更好的答案。这将使我们所有人受益:)@vsync我认为你越界了。问题是如何编写一个简单的管道函数。我已经提供了这个问题的答案,如果你想知道gulp是如何工作的,你应该去他们的存储库。Stackoverflow是“唯一”一个你知道的问答网站。是的,如果我记得正确的话,会有贯穿的2个npm包。在我的管道中的下一步,“结束”永远不会发生?可能会帮助一些人。