一、zlib
模块简介
-
zlib
是 Node.js 内置的压缩模块,基于 zlib C 库实现。 -
支持常见压缩算法:gzip、deflate、brotli。
-
常用于:HTTP 压缩传输 、文件压缩存储 、流式数据压缩。
引入模块:
javascript
const zlib = require('zlib');
二、zlib
模块 API 分类详解
1. 压缩/解压缩(同步/异步方式)
异步 API(推荐,非阻塞 IO)
javascript
zlib.gzip(buffer[, options], callback)
zlib.gunzip(buffer[, options], callback)
zlib.deflate(buffer[, options], callback)
zlib.inflate(buffer[, options], callback)
zlib.deflateRaw(buffer[, options], callback)
zlib.inflateRaw(buffer[, options], callback)
zlib.brotliCompress(buffer[, options], callback)
zlib.brotliDecompress(buffer[, options], callback)
示例:
javascript
const input = 'Hello Node.js';
zlib.gzip(input, (err, result) => {
if (err) throw err;
console.log('压缩后:', result.toString('base64'));
zlib.gunzip(result, (err, output) => {
if (err) throw err;
console.log('解压后:', output.toString());
});
});
同步 API(阻塞线程,少用)
javascript
zlib.gzipSync(buffer[, options])
zlib.gunzipSync(buffer[, options])
zlib.deflateSync(buffer[, options])
zlib.inflateSync(buffer[, options])
zlib.deflateRawSync(buffer[, options])
zlib.inflateRawSync(buffer[, options])
zlib.brotliCompressSync(buffer[, options])
zlib.brotliDecompressSync(buffer[, options])
2. 流式压缩/解压(大文件推荐)
可用于 管道 ,处理大文件(如 .tar.gz
),不需要一次性加载到内存。
javascript
zlib.createGzip([options])
zlib.createGunzip([options])
zlib.createDeflate([options])
zlib.createInflate([options])
zlib.createDeflateRaw([options])
zlib.createInflateRaw([options])
zlib.createBrotliCompress([options])
zlib.createBrotliDecompress([options])
示例:
javascript
const fs = require('fs');
const zlib = require('zlib');
// 文件压缩
fs.createReadStream('input.txt')
.pipe(zlib.createGzip())
.pipe(fs.createWriteStream('input.txt.gz'));
// 文件解压
fs.createReadStream('input.txt.gz')
.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream('output.txt'));
3. 常见选项
-
level
: 压缩等级(0-9,默认zlib.constants.Z_DEFAULT_COMPRESSION
) -
windowBits
: 压缩算法的滑动窗口大小 -
memLevel
: 内存使用量(1-9) -
strategy
: 压缩策略 -
flush
: 刷新模式 -
finishFlush
: 结束刷新模式 -
chunkSize
: 默认 16KB
示例(高压缩比):
javascript
const options = { level: zlib.constants.Z_BEST_COMPRESSION };
zlib.gzip('hello', options, (err, res) => {
console.log(res.toString('base64'));
});
4. 常量
zlib.constants
提供了许多压缩参数常量:
-
Z_NO_COMPRESSION
(0) -
Z_BEST_SPEED
(1) -
Z_BEST_COMPRESSION
(9) -
Z_DEFAULT_COMPRESSION
(-1) -
Z_BROTLI_PARAM_QUALITY
(Brotli 压缩质量 0--11)
javascript
console.log(zlib.constants.Z_BEST_COMPRESSION); // 9
三、常用 API 总结
API | 功能 | 常用场景 |
---|---|---|
gzip / gunzip |
gzip 压缩 / 解压 | HTTP 响应压缩、日志文件压缩 |
deflate / inflate |
deflate 压缩 / 解压 | 老的 HTTP 压缩协议 |
brotliCompress / brotliDecompress |
Brotli 压缩 / 解压 | HTTP/2, HTTP/3 推荐算法 |
createGzip / createGunzip |
流式 gzip | 大文件压缩(如 .tar.gz ) |
createBrotliCompress / createBrotliDecompress |
流式 Brotli | Web 内容压缩 |
zlib.constants |
压缩参数常量 | 调整压缩率/速度平衡 |
四、使用场景总结
1. HTTP 响应压缩
javascript
const http = require('http');
const zlib = require('zlib');
http.createServer((req, res) => {
const raw = 'Hello World, this is compressed!';
res.writeHead(200, { 'Content-Encoding': 'gzip' });
zlib.gzip(raw, (err, buffer) => {
res.end(buffer);
});
}).listen(3000);
2. 日志文件压缩
javascript
const fs = require('fs');
const zlib = require('zlib');
fs.createReadStream('server.log')
.pipe(zlib.createGzip())
.pipe(fs.createWriteStream('server.log.gz'));
3. 大文件解压缩
javascript
fs.createReadStream('backup.tar.gz')
.pipe(zlib.createGunzip())
.pipe(fs.createWriteStream('backup.tar'));
4. Brotli 在前端资源压缩(HTTP/2 常用)
javascript
const input = 'Some static file content';
zlib.brotliCompress(input, {
params: {
[zlib.constants.BROTLI_PARAM_QUALITY]: 11, // 最优压缩
}
}, (err, result) => {
console.log('Brotli 压缩结果:', result.toString('base64'));
});
5. 自定义压缩等级
javascript
zlib.gzip('test', { level: zlib.constants.Z_BEST_SPEED }, (err, res) => {
console.log('快速压缩:', res.length);
});
zlib.gzip('test', { level: zlib.constants.Z_BEST_COMPRESSION }, (err, res) => {
console.log('高压缩比:', res.length);
});
五、注意事项
-
异步优先:避免使用同步 API,防止阻塞事件循环。
-
流式操作 :处理大文件时,推荐
pipe
流式压缩,避免内存溢出。 -
算法选择:
-
gzip → 兼容性最好
-
deflate → 较旧协议用
-
brotli → 新一代 Web 压缩(HTTP/2, HTTP/3 推荐)
-
-
压缩比与性能权衡:
- 压缩等级越高(9 / Brotli 11),压缩率更好但 CPU 占用更高。
✅ 总结:
-
zlib
模块提供了 同步 / 异步 / 流式 三类 API。 -
常用 API:
gzip/gunzip
、deflate/inflate
、brotliCompress/brotliDecompress
、createGzip/createGunzip
。 -
典型场景:HTTP 内容压缩 、日志归档 、大文件存储 、Web 资源优化。