# 使用 Stream 處理
> 極力推薦讓你所寫的插件支持 stream。這里有一些關于讓插件支持 stream 的一些有用信息。
> 請確保使用處理錯誤的最佳實踐,并且加入一行代碼,使得 gulp 能在轉換內容的期間在捕獲到第一個錯誤時候正確報出錯誤。
[編寫插件](../) > 編寫以 stream 為基礎的插件
## 使用 stream 處理
讓我們來實現一個用于在文件頭部插入一些文本的插件,這個插件支持 file.contents 所有可能的形式。
```
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;
}
// 插件級別函數 (處理文件)
function gulpPrefixer(prefixText) {
if (!prefixText) {
throw new PluginError(PLUGIN_NAME, 'Missing prefix text!');
}
prefixText = new Buffer(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;
}
// 暴露(export)插件的主函數
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'));
```
##?一些使用 stream 的插件
* [gulp-svgicons2svgfont](https://github.com/nfroidure/gulp-svgiconstosvgfont)
- gulp 中文文檔
- 入門指南
- gulp API 文檔
- 編寫插件
- 指導
- 使用 buffer
- 使用 Stream 處理
- 測試
- FAQ
- gulp 技巧集
- 整合 streams 來處理錯誤
- 刪除文件和文件夾
- 使用 watchify 加速 browserify 編譯
- 增量編譯打包,包括處理整所涉及的所有文件
- 將 buffer 變為 stream (內存中的內容)
- 在 gulp 中運行 Mocha 測試
- 僅僅傳遞更改過的文件
- 從命令行傳遞參數
- 只重新編譯被更改過的文件
- 每個文件夾生成單獨一個文件
- 串行方式運行任務,亦即,任務依賴
- 擁有實時重載(live-reloading)和 CSS 注入的服務器
- 通過 stream 工廠來共享 stream
- 指定一個新的 cwd (當前工作目錄)
- 分離任務到多個文件中
- 使用外部配置文件
- 在一個任務中使用多個文件來源
- Browserify + Uglify2 和 sourcemaps
- Browserify + Globs
- 同時輸出一個壓縮過和一個未壓縮版本的文件
- 改變版本號以及創建一個 git tag
- Swig 以及 YAML front-matter 模板