14.node中的转化流Transform

转换流

转化流是一种双工流,继承双工流,能够使得可写流与可读流之间相互转化

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')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值