// 1、引入模块
var through = require('through2');
var gutil = require('gulp-util');
var PluginError = gutil.PluginError;
const PLUGIN_NAME = 'gulp-prefixer';
function prefixStream(prefixText) {
var stream = through();
stream.write(prefixText);
return stream;
}
// 2、编写插件主函数 (处理文件)
function gulpPrefixer(prefixText) {
if (!prefixText) {
throw new PluginError(PLUGIN_NAME, 'Missing prefix text!');
}
prefixText = new Buffer(prefixText); // 将prefixText以二进制形式存储
// 创建一个让每个文件通过的 stream 通道
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()) {
// 定义转换内容的 streamer
var streamer = prefixStream(prefixText);
// 从 streamer 中捕获错误,并发出一个 gulp的错误
streamer.on('error', this.emit.bind(this, 'error'));
// 开始转换
file.contents = file.contents.pipe(streamer);
}
// 确保文件进去下一个插件
this.push(file);
// 告诉 stream 转换工作完成
cb();
});
// 返回文件 stream
return stream;
}
// 3、暴露(export)插件的主函数
module.exports = gulpPrefixer;
3、主函数编写
判断插件的输入类型:Buffer Or Stream
Buffer类一般指该插件接收的数据是Buffer;Stream类该插件接收的数据是Stream,在使用gulp时,由gulp.src读取的文件传递给后续插件时默认都是Buffer,若想支持Stream,需显示调用gulp.src(路径,{buffer:false})。从大部分gulp插件使用方式来看,处理Buffer的情形占大多数。