javascript - gulp-foreach 不循环遍历所有文件

标签 javascript node.js gulp gulp-print

我对 gulp-foreach 有一个非常基本的用法,但它失败得如此严重,我想我一定做错了什么;我只是(目前)尝试打印 gulp.src 中找到的所有文件。当使用 gulp-foreach 执行此操作时,只会打印非常非常小的文件样本 - 数百个中的大约 15 个。当使用 gulp-print 时,事情会按预期工作。

const gulp = require('gulp'),
      foreach = require('gulp-foreach'),
      gulpPrint = require('gulp-print');

gulp.src([`../../**/*.js`].concat([]))
    .pipe(gulpPrint(path => {
        console.log(path);
    }))
    .pipe(foreach((stream, file) => {
        console.log(file.path);
        return stream;
    }))

带有 foreach 的代码被触发大约 15 次,与 gulpPrint 交错,随后是大量的 gulpPrint 语句。如果我注释掉 gulpPrint 部分,foreach 会打印大约 15 次,然后退出,而 gulpPrint 单独如预期的那样,会用每个文件已找到,正如它应该的那样。

我可以只使用gulp-print,但我想知道gulp-foreach我做错了什么。

最佳答案

首先:gulp-foreach 并不是真正适合您的用例的插件。

gulp-foreach 允许您为每个文件创建一个子流,并将子流的结果发送到原始流中。这意味着您可以为每个输入文件发出多个文件 ( see this example )。在这方面它与higher-order function flatmap非常相似。在函数式编程中。这就是为什么 gulp-foreach 的作者有 recently renamed gulp-flatmap 的插件。

您感兴趣的是访问流中的每个文件并打印其路径,这使得 higher-order function map 成为一个例子。 。正确的插件是 map-streamgulp-tap (这是 gulp-foreach used to recommend 的作者)。

现在回答你的实际问题。

如前所述,gulp-foreach 将所有文件从创建的子流发送到原始流。但是,您对写入原始流的文件没有执行任何操作。 Node.js 对象流默认有一个 highWaterMark 16 个,因此一旦 gulp-foreach 将 16 个文件写入原始流,缓冲区就已满并且 gulp-foreach 会阻塞。

为了解决这个问题,您需要使用 gulp-foreach 写入流的文件。您可以简单地使用虚拟 .on('data') 处理程序来实现此目的:

gulp.src([`../../**/*.js`].concat([]))
  .pipe(gulpPrint(path => {
    console.log(path);
  }))
  .pipe(foreach((stream, file) => {
    console.log(file.path);
    return stream;
  }))
  .on('data', (data) => { });

然而,在 gulp 中执行此操作的通常方法是让 gulp 消耗流,而不是简单地从创建流的任务中返回流:

gulp.task('default', function() {
  return gulp.src([`../../**/*.js`].concat([]))
    .pipe(gulpPrint(path => {
       console.log(path);
    }))
    .pipe(foreach((stream, file) => {
       console.log(file.path);
       return stream;
    }));
});

关于javascript - gulp-foreach 不循环遍历所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38855522/

相关文章:

javascript - ajax成功后如何在模态上显示隐藏按钮?

javascript - 如何在 bodymovin.js 中使用事件

node.js - MongoDB:查询数组字段中的项目列表

javascript - NodeJS函数执行顺序

node.js - Discord.js 音乐机器人 "TypeError"使用调度程序播放音频时

javascript - Gulp.js : task based on forEach loop

javascript - 从 Elasticsearch 响应数组中删除对象

javascript - 正则表达式捕获特定字符串之前的所有内容,然后逐步捕获

javascript - gulp.watch() 不适用于 Jade

javascript - 按模式重命名所有 HTML、CSS 和 JS 中的所有选择器(为选择器添加前缀)