跳到主要内容

处理流

强烈建议编写支持流的插件。以下是有关创建支持流的 gulp 插件的一些信息。

请确保遵循关于错误处理的最佳实践,并添加一行代码使 gulp 插件重新发出在内容转换期间捕获的第一个错误。

编写插件 > 编写基于流的插件

处理流

让我们实现一个在文件前面添加一些文本的插件。这个插件支持 file.contents 的所有可能形式。

var through = require('through2');
var PluginError = require('plugin-error');

// 常量
const PLUGIN_NAME = 'gulp-prefixer';

function prefixStream(prefixText) {
var stream = through();
stream.write(prefixText);
return stream;
}

// 插件级函数(处理文件)
function gulpPrefixer(prefixText) {
if (!prefixText) {
throw new PluginError(PLUGIN_NAME, 'Missing prefix text!');
}

prefixText = new Buffer(prefixText); // 提前分配

// 创建一个每个文件都会通过的流
var stream = through.obj(function(file, enc, cb) {
if (file.isBuffer()) {
this.emit('error', new PluginError(PLUGIN_NAME, 'Buffers not supported!'));
return cb();
}

if (file.isStream()) {
// 定义将转换内容的流处理器
var streamer = prefixStream(prefixText);
// 捕获流处理器中的错误并发出 gulp 插件错误
streamer.on('error', this.emit.bind(this, 'error'));
// 开始转换
file.contents = file.contents.pipe(streamer);
}

// 确保文件通过下一个 gulp 插件
this.push(file);
// 告诉流引擎我们已完成处理此文件
cb();
});

// 返回文件流
return stream;
}

// 导出插件主函数
module.exports = gulpPrefixer;

上述插件可以这样使用:

var gulp = require('gulp');
var gulpPrefixer = require('gulp-prefixer');

gulp.src('files/**/*.js', { buffer: false })
.pipe(gulpPrefixer('prepended string'))
.pipe(gulp.dest('modified-files'));

一些使用流的插件