转换流
转化流是一种双工流,继承双工流,能够使得可写流与可读流之间相互转化
1. 转换流的实现
stream.Transform 类原型上继承自 stream.Duplex 并实现其自己版本的 writable._write() 和 readable._read() 方法。 自定义的 Transform 实现必须实现 transform._transform() 方法,也可以实现 transform._flush() 方法。
// 转化流——可以吧可写流转换成可读流,可以用于加密 压缩
const { Transform } = require('stream')
class MyTransfrom extends Transform{
_transform(chunk, encoding, cb){
// 这里可以调用push方法
this.push(chunk.toString().toUpperCase()) // 将读到的内容转成大写,再给可写流
cb();
}
}
let my = new MyTransfrom()
// process.stdin.pipe(my) 这样,my就是可写流
// (my).pipe(process.stdout) 这样,my就是可读流
// process.stdin.pipe(my).pipe(process.stdout)这样my就充当了转化流,将读到的数据传递给my,也就会调用Transform类的transform方法,这个transform方法会调用子类的_transform方法,将读到的内容传入到这个_transform方法中
// 所以,可以通过process.stdin.pipe(my).pipe(process.stdout)的pipe(my),将流进行转化,
process.stdin.pipe(my).pipe(process.stdout)
// 可以做压缩,可以将源文件内容读取出来,然后转化流进行压缩,然后再给可写流,写到文件中
3. 转化流的应用场景
gulp 非常擅长处理代码本地构建流程,看一段官网的示例代码
gulp.src('client/templates/*.jade')
.pipe(jade())
.pipe(minify())
.pipe(gulp.dest('build/minified_templates'));
其中 jada() 和 minify() 就是典型的 Transform,处理流程大概是
.jade 模板文件 -> jada() -> html 文件 -> minify -> 压缩后的 html
可以看出来,jade() 和 minify() 都是对输入数据做了些特殊处理,然后交给了输出数据。
4. 双工流与转化流的异同点
- 转化流继承自双工流
- 当一个流同时面向生产者(可读流)和消费者(可写流)的时候,应该使用Duplex
- Duplex 虽然同事具备可读流和可写流,但两者是相对独立的;Transform 的可读流的数据会经过一定的处理过程自动进入可写流。
5.process中的可读流可写流
- process.stdin是一个可读流
- process.stdout和process.stderr是一个可写流
// process.stdin是一个可读流
process.stdin.on('data', (chunk) => { // 可以监控用户输入内容
// console.log('可读流', chunk)
process.stdout.write(chunk)
})
// 上面再可读流里面写可写流,直接可以使用pipe
process.stdin.pipe(process.stdout)
// process.stdout和process.stderr是一个可写流
process.stdout.write('ok\r\n')
process.stderr.write('err\r\n')