MDN Web API 教程:深入理解 Compression Streams API
2025-07-06 08:17:00作者:幸俭卉
概述
Compression Streams API 是现代浏览器提供的一个 JavaScript API,它允许开发者直接在浏览器中对数据流进行压缩和解压缩操作,支持 gzip 和 deflate 两种压缩格式。这个 API 的出现意味着开发者不再需要引入第三方压缩库,可以显著减小应用程序的体积。
核心概念
流式处理优势
Compression Streams API 最大的特点是采用了流式处理方式,这意味着:
- 可以处理大型文件而不会耗尽内存
- 数据可以边传输边压缩/解压,提高效率
- 特别适合网络传输场景
支持的压缩格式
API 目前支持两种广泛使用的压缩格式:
- gzip - 使用 LZ77 和 Huffman 编码的组合,压缩率较高
- deflate - 原始压缩格式,gzip 实际上是 deflate 的包装格式
主要接口
CompressionStream
用于创建压缩流的主要接口,构造函数接受压缩格式参数:
const compressionStream = new CompressionStream("gzip");
DecompressionStream
用于创建解压缩流的主要接口,同样接受压缩格式参数:
const decompressionStream = new DecompressionStream("gzip");
实际应用示例
基本压缩示例
以下代码展示了如何将一个可读流通过 gzip 压缩:
const compressedStream = readableStream.pipeThrough(
new CompressionStream("gzip")
);
文件解压示例
这个例子展示了如何解压一个 gzip 压缩的 Blob 对象:
async function decompressBlob(blob) {
const decompressionStream = new DecompressionStream("gzip");
const decompressedStream = blob.stream().pipeThrough(decompressionStream);
return await new Response(decompressedStream).blob();
}
结合 Fetch API 使用
Compression Streams API 可以很好地与 Fetch API 配合使用:
// 压缩请求体
async function postCompressedData(url, data) {
const compressedStream = new CompressionStream("gzip");
const compressedBody = data.stream().pipeThrough(compressedStream);
await fetch(url, {
method: "POST",
body: compressedBody,
headers: {
"Content-Encoding": "gzip"
}
});
}
// 解压响应
async function getDecompressedData(url) {
const response = await fetch(url);
const decompressionStream = new DecompressionStream("gzip");
const decompressedStream = response.body.pipeThrough(decompressionStream);
return await new Response(decompressedStream).text();
}
性能考虑
- 压缩级别:当前 API 不提供压缩级别设置,使用默认压缩级别
- 内存使用:流式处理确保内存使用稳定,不会因大文件而内存溢出
- Web Worker 支持:API 可在 Worker 线程中使用,避免阻塞主线程
浏览器兼容性
Compression Streams API 是一个相对较新的 API,目前主要在现代浏览器中得到支持。在实际使用前,建议检查浏览器兼容性情况或提供回退方案。
最佳实践
- 内容协商:在使用压缩传输时,确保服务器和客户端都支持相同的压缩格式
- 错误处理:添加适当的错误处理,特别是处理不支持的压缩格式情况
- 性能测试:对于关键路径,测试压缩/解压缩的性能影响
总结
Compression Streams API 为 Web 应用提供了原生的数据压缩能力,特别适合需要处理大量数据的场景。通过流式处理,它能够高效地压缩和解压数据,而不会造成内存压力。随着浏览器支持的普及,这个 API 将成为 Web 开发中数据压缩的首选方案。