Streams API 实战:浏览器端流式大文件处理架构
技术架构(更新于 2026年5月31日)
为什么需要流式处理?
传统方式读取大文件:
// ❌ 200MB 文件 → 200MB ArrayBuffer → 可能 OOM
const buffer = await file.arrayBuffer();
processEntireBuffer(buffer);
流式处理:
// ✅ 每次只处理 64KB chunk
const stream = file.stream();
for await (const chunk of stream) {
processChunk(chunk); // 64KB
}
| 对比 | 全量加载 | 流式处理 |
|---|---|---|
| 内存占用 | 文件大小 | ~64KB (chunk 大小) |
| 开始处理 | 全部读完 | 第一个 chunk 到达 |
| 200MB 文件 | 200MB 内存 | ~64KB 内存 |
| 1GB 文件 | 可能 OOM | 正常运行 |
三种核心 Stream
ReadableStream → 数据源(文件、网络响应)
TransformStream → 中间处理(压缩、加密、格式转换)
WritableStream → 数据目的地(文件下载、网络上传)
ReadableStream
const response = await fetch('/large-file.pdf');
const reader = response.body!.getReader();
while (true) {
const { done, value } = await reader.read();
if (done) break;
console.log(`Received ${value.byteLength} bytes`);
}
TransformStream
const compressor = new TransformStream({
transform(chunk, controller) {
const compressed = gzipSync(chunk);
controller.enqueue(compressed);
}
});
// 管道连接
fileStream.pipeThrough(compressor).pipeTo(downloadStream);
背压 (Backpressure)
当生产者速度 > 消费者速度时,Stream 自动暂停生产者:
FileReader (快) → [缓冲区满] → 暂停读取
↓
TransformStream (慢) → 消费 chunk → 缓冲区有空间 → 恢复读取
这是 Stream 相比手动 chunk 循环的核心优势——自动流量控制,无需手动管理缓冲区大小。
工具库中的流式应用
Gzip 压缩/解压
压缩解压工具 使用 CompressionStream API:
const compressed = file.stream().pipeThrough(new CompressionStream('gzip'));
// 流式压缩,无需全量加载
大 PDF 分块读取
async function* readPdfChunks(file: File, chunkSize = 4 * 1024 * 1024) {
let offset = 0;
while (offset < file.size) {
const chunk = file.slice(offset, offset + chunkSize);
yield await chunk.arrayBuffer();
offset += chunkSize;
}
}
for await (const chunk of readPdfChunks(largePdf)) {
await processPdfChunk(chunk);
}
流式下载
const stream = new ReadableStream({
async start(controller) {
for await (const chunk of generateChunks()) {
controller.enqueue(chunk);
}
controller.close();
}
});
const response = new Response(stream, {
headers: { 'Content-Disposition': 'attachment; filename="output.zip"' }
});
Stream API 兼容性
| API | Chrome | Firefox | Safari | Edge |
|---|---|---|---|---|
| ReadableStream | 52+ | 65+ | 10.1+ | 79+ |
| TransformStream | 80+ | 102+ | 14.1+ | 80+ |
| CompressionStream | 80+ | 113+ | 16.4+ | 80+ |
| File.stream() | 76+ | 69+ | 14.1+ | 79+ |
CompressionStream 较新,不支持的浏览器回退到 pako/fflate 库的全量处理。
总结
Streams API 是处理大文件的现代标准。ReadableStream 分块读取、TransformStream 中间处理、背压自动流控——这套机制让浏览器端处理 GB 级文件成为可能,是工具库大文件工具(PDF、视频、压缩)的底层基础设施。
本站提供浏览器本地工具,免注册即可试用 →
#Streams API#ReadableStream#TransformStream#大文件#流式处理