【问题标题】:How to run a buffer through a gulp plugin?如何通过 gulp 插件运行缓冲区?
【发布时间】:2016-08-15 14:09:21
【问题描述】:

我正在尝试编写一个函数,让您可以将任何 gulp 插件用作简单的内存缓冲区转换器(隐藏所有流/乙烯基材料)。例如,它可以这样调用:

const gulpMinifyHtml = require('gulp-minify-html');

transformBufferWithGulpPlugin(inputBuffer, gulpMinifyHtml()).then(outputBuffer => {
    // outputBuffer should now be a minified version of inputBuffer
});

(注意。我正在寻找一种通用的方法来使用 any gulp 插件;gulp-minify-html 只是一个示例。)


这似乎很容易,但我正在努力让它发挥作用。我认为我需要做的是:

  1. 构造一个新的Vinyl 实例,内容设置为inputBuffer
  2. 将此乙烯基实例放入对象流 (?)
  3. 通过 gulp 插件管理对象流
  4. 从流中收集输出
  5. 当流完成输出时,从乙烯基实例中获取内容缓冲区,并使用它进行解析。

这些步骤基本正确吗?谁能给我看一个可行的例子,或者给我一个可以做到的模块?

【问题讨论】:

    标签: javascript gulp


    【解决方案1】:

    以下应该有效。这使用stream-array 创建流。

    var File = require('vinyl');
    var streamify = require('stream-array');
    
    function transformBufferWithGulpPlugin(inputBuffer, gulpPlugin) {
      return new Promise(function(resolve, reject) {
        streamify([new File({path:'dummy', contents:inputBuffer})])
          .pipe(gulpPlugin)
          .on('error', reject)
          .on('data', function(file) {
            resolve(file.contents);
        });
      });
    }
    
    var minify = require('gulp-html-minify');
    
    transformBufferWithGulpPlugin(new Buffer('<p>\n Test \n</p>'), minify())
      .then(function(result) {
         console.log(result.toString());
      }, function(error) { 
         console.error(error);
      });
    

    没有必要像上面那样指定一个虚拟的pathvinyl 不需要它),但某些插件可能只有在有path 属性时才能工作。

    【讨论】:

    • 谢谢,这适用于我测试过的一个插件 (gulp-template) 但不适用于其他插件 (gulp-autoprefixergulp-clean-css 和其他插件)。在非工作示例中,数据事件触发正常,但传递给resolvefile.contents 似乎包含原始的、未转换的源。你能想到这可能是什么原因吗?我已经验证了这些插件在具有相同选项的常规 gulpfile 中工作。
    • 两个插件都试过了。工作正常。
    • 嗯好的我再试一次
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    相关资源
    最近更新 更多