强烈建议写插件的时候支持流处理,本文是关于创建插件支持流的介绍。确保遵循规范处理错误,在内容处理的同时进行异常捕获。
使用流处理
我们来实现一个文件文本处理的插件,这个插件支持`file.contents`所有可能的形式。
var through = require('through2'); var gutil = require('gulp-util'); var PluginError = gutil.PluginError; // consts const PLUGIN_NAME = 'gulp-prefixer'; function prefixStream(prefixText) { var stream = through(); stream.write(prefixText); return stream; } // plugin level function (dealing with files) function gulpPrefixer(prefixText) { if (!prefixText) { throw new PluginError(PLUGIN_NAME, 'Missing prefix text!'); } prefixText = new Buffer(prefixText); // allocate ahead of time // creating a stream through which each file will pass 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()) { // define the streamer that will transform the content var streamer = prefixStream(prefixText); // catch errors from the streamer and emit a gulp plugin error streamer.on('error', this.emit.bind(this, 'error')); // start the transformation file.contents = file.contents.pipe(streamer); } // make sure the file goes through the next gulp plugin this.push(file); // tell the stream engine that we are done with this file cb(); }); // returning the file stream return stream; }; // exporting the plugin main function 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'));