Gulp:定制管道,可批量转换许多文件

时间:2018-07-24 13:12:29

标签: gulp

编辑,看来我正在尝试创建一些concat gulp管道,该管道首先会转换各种文件的内容。

我一直在使用through2来编写custom pipe。范围:使用gulp-watch,运行一个任务,将其全部加载,在内存中进行转换并输出一些文件。

Through2带有“ highWaterMark”选项,默认情况下一次读取16个文件。我的管道不需要进行内存优化(它读取数十个<5kb json,运行一些转换并输出2或3个json)。但我想了解首选方法。

我想找到一个很好的资源/教程,解释如何处理这种情况,欢迎任何潜在客户。

谢谢

1 个答案:

答案 0 :(得分:1)

好的,发现我的问题。

使用through2创建自定义管道时,为了“消费”数据(而不达到highWaterMark限制),只需添加.on('data', () => ...)处理程序,如以下示例所示:

function processAll18nFiles(done) {
  const dictionary = {};
  let count = 0; 
  console.log('[i18n] Rebuilding...');
  gulp
    .src(searchPatternFolder)
    .pipe(
      through.obj({ highWaterMark: 1, objectMode: true }, (file, enc, next) => {
        const { data, path } = JSON.parse(file.contents.toString('utf8'));
        next(null, { data, path });
      })
    )
    // this line fixes my issue, the highWaterMark doesn't cause a limitation now
    .on('data', ({ data, path }) => ++count && composeDictionary(dictionary, data, path.split('.')))
    .on('end', () =>
      Promise.all(Object.keys(dictionary).map(langKey => writeDictionary(langKey, dictionary[langKey])))
        .then(() => {
          console.log(`[i18n] Done, ${count} files processed, language count: ${Object.keys(dictionary).length}`);
          done();
        })
        .catch(err => console.log('ERROR ', err))
    );

rem 注意“ done”参数会迫使开发人员在done()

时拨打电话