今天(昨天)把之前为了解决webjs中的某些问题而写的一个工具抽取了出来,也顺便介绍一下它的用法和webjs的最新功能。
相信很多人都很喜欢到github上看一下node和第三方模块的代码,这些同学肯定有发现node的源码中,stream是“能懒则懒”,虽然在API文档中,对Stream模块的说明十分详细,但是当你真正require(‘stream’)的时候,你就要想哭了。模块中返回的构造函数中,只有一个最有特色的方法——pipe,其他都需要你去按照API文档自己开发Stream I/O。(这不坑爹么?!)
当然,joyent这样做也是有他们的原因的。在node内部,使用Stream机制的东西还真不少,STDIO, HTTP/HTTPS, File System, Zlib,大家不难发现这几个模块的共同点吧,就是都需要借助底层C++的驱动,让数据随线程流动起来。于是乎,在JavaScript编写的程序中,就很难做到异步数据输出这一点。但其实非也,就以CSS Engine来说,可以在每完成一个Rule的编译的时候,就把这段CSS输出到Stream中。 那么有人会问,我的dataStream是干嘛用的,其实这个模块原本是在webjs中实现的一个Stream框架,用于解决webjs上的某些结构问题,而现在我也用它给webjs开发了一个Response Pipelining机制,就是需要用到dataStream进行运作的。
dataStream基本上实现了Writable/Readable Stream的方法和事件,为了照顾中文数据,我并没有直接使用Buffer,而是使用了好机油小田亲的bufferhelper。提供了两套处理方案。
安装
像平常一样的安装方法。
npm install dataStream
使用
var dataStream = require('dataStream');
var MyStream = new dataStream();
我们还可以这样
var MyStream = new dataStream({ readable: false });
MyStream.on('complate', function () {
var body = this.body().toString();
body += 'somechanges';
this.emit('data', body);
});
readFileStream.pipe(MyStream).pipe(process.stdout);
以上代码是在全部数据读取完成以后再进行处理。
如果是要做到真正的pipe,你可以这样做。
var MyStream = new dataStream({
data: function (chunk) {
return chunk.toString() + 'data';
}
});