Node.js zlib模块所有 API 详解 + 常用 API + 使用场景

一、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);
});

五、注意事项

  1. 异步优先:避免使用同步 API,防止阻塞事件循环。

  2. 流式操作 :处理大文件时,推荐 pipe 流式压缩,避免内存溢出。

  3. 算法选择

    • gzip → 兼容性最好

    • deflate → 较旧协议用

    • brotli → 新一代 Web 压缩(HTTP/2, HTTP/3 推荐)

  4. 压缩比与性能权衡

    • 压缩等级越高(9 / Brotli 11),压缩率更好但 CPU 占用更高。

✅ 总结:

  • zlib 模块提供了 同步 / 异步 / 流式 三类 API。

  • 常用 API:gzip/gunzipdeflate/inflatebrotliCompress/brotliDecompresscreateGzip/createGunzip

  • 典型场景:HTTP 内容压缩日志归档大文件存储Web 资源优化

相关推荐
谢小飞13 小时前
大文件上传很难?学会这招,GB文件秒传不是梦
前端·node.js
周小董1 天前
[1367]npm 安装 canvas 报错 node-gyp ERR
前端·npm·node.js
张龙6872 天前
Node.js 内存泄漏排查实战:从内存曲线到堆快照,一条可复用的定位路径
性能优化·node.js
烂蜻蜓2 天前
Node.js入门教程(七):工作机制
node.js
凌云拓界3 天前
NodeVerdict | .ndv 二进制格式:为 WASM 解码器设计的紧凑布局
安全·架构·开源·node.js·编辑器·软件工程·wasm
凌云拓界3 天前
NodeVerdict | 性能门禁:把追踪数据变成 CI 规则
ci/cd·信息可视化·开源·node.js·bug·数据可视化·安全架构
烂蜻蜓3 天前
Node.js入门教程(五):NVM 管理多版本 Node.js
node.js
接着奏乐接着舞。3 天前
LLM 流式响应:网慢和断线怎么处理?
前端·人工智能·node.js·aigc
MartinYeung53 天前
npm爆发大规模供应链攻击 蠕虫污染 2000+ 个包版本: 深度技术剖析
前端·npm·node.js
鲟迹3 天前
NVM 管理Node.js版本
node.js