读一个 10 GB 的日志文件,直接 readFile 会把 10 GB 全塞进内存;Stream 则像水管:readable 流一块一块产出数据、writable 流一块一块写入,任何时刻内存里只有当前那一块。四种类型:Readable(可读)、Writable(可写)、Duplex(可读写)、Transform(读入变换后写出)。
Stream 的经典应用是 .pipe() 管道:源流 pipe 到目标流自动搬运。HTTP 请求/响应本身就是流——向响应里 stream 一个大文件,用户的首字节时间(TTFB)大幅提前。常见坑:背压(backpressure)——写入慢于读取时数据堆积,pipe 会自动暂停读取,手动写流要监听 drain 事件。
const fs = require('fs'); const http = require('http'); const { Transform } = require('stream'); // 流式读取大文件,内存占用恒定 fs.createReadStream('big.log') .pipe(new Transform({ // 边读边转换 transform(chunk, enc, cb) { // 只保留含 ERROR 的行 const lines = chunk.toString().split('\n'); cb(null, lines.filter(l => l.includes('ERROR')).join('\n') + '\n'); }, })) .pipe(fs.createWriteStream('errors.log')); // 写入目标文件 // 流式 HTTP 响应:用户立刻收到首字节 http.createServer((req, res) => { fs.createReadStream('movie.mp4') .pipe(res); // 边读边响应 }).listen(3000);