一、基础概念

1. msgpack-lite

  • 作用:将 JavaScript
    对象压缩为二进制格式(MessagePack),是一种比 JSON
    更紧凑的序列化方式。
  • 特点
    • 类似 JSON,但更高效(体积小、速度快)。
    • 支持 Buffer,适合在 网络传输存储 时减少数据量。
    • 常见应用场景:WebSocket 消息传输、缓存、日志压缩。

2. zlib(Node.js 内置模块)

  • 作用:提供 Gzip/Deflate 等压缩算法。
  • 特点
    • 面向字节流,可以压缩/解压 Buffer 或文件。
    • 常见应用场景:HTTP 响应压缩(gzip/br)、文件压缩、日志压缩。

区别

  • msgpack-lite:序列化 & 二进制化(数据结构优化)。
  • zlib:压缩算法(熵编码 + 压缩率优化)。
  • 配合使用:先用 msgpack-lite 序列化,再用 zlib
    压缩,体积更小。

二、安装

npm install msgpack-lite

zlib 是 Node.js 内置模块,不需要安装。


三、msgpack-lite 使用

import msgpack from "msgpack-lite";

// 示例数据
const obj = { 
  id: 1, 
  name: "测试", 
  list: new Array(1000).fill("hello") 
};

// 1. 序列化(对象 → 二进制 Buffer)
const encoded = msgpack.encode(obj);
console.log("编码后大小:", encoded.length);

// 2. 反序列化(二进制 Buffer → 对象)
const decoded = msgpack.decode(encoded);
console.log("解码结果:", decoded);

📌 对比 JSON

const json = JSON.stringify(obj);
console.log("JSON 大小:", Buffer.byteLength(json));
console.log("MessagePack 大小:", encoded.length);

四、zlib 使用

import { gzip, gunzip } from "zlib";

// 数据
const str = "这是一段需要压缩的文本,重复重复重复...";

// 压缩
gzip(Buffer.from(str), (err, compressed) => {
  if (err) throw err;
  console.log("压缩后大小:", compressed.length);

  // 解压
  gunzip(compressed, (err, decompressed) => {
    if (err) throw err;
    console.log("解压结果:", decompressed.toString());
  });
});

五、组合使用(最佳实践)

import msgpack from "msgpack-lite";
import { gzip, gunzip } from "zlib";

// 示例数据
const obj = { user: "Tom", data: new Array(5000).fill("重复数据...") };

// 1. msgpack 序列化
const encoded = msgpack.encode(obj);

// 2. gzip 压缩
gzip(encoded, (err, compressed) => {
  if (err) throw err;
  console.log("压缩后大小:", compressed.length);

  // 3. 解压 + 反序列化
  gunzip(compressed, (err, decompressed) => {
    if (err) throw err;
    const decoded = msgpack.decode(decompressed);
    console.log("解压 & 还原结果:", decoded);
  });
});

六、性能 & 场景对比

技术 优点 缺点 典型场景
JSON 通用、可读 冗余大、体积大 Web API、配置文件
msgpack-lite 紧凑、快速 需要库、不易读 WebSocket、缓存、数据库存储
zlib 高压缩率 CPU 开销大 HTTP 压缩、文件压缩
组合使用 压缩率最高 序列化/压缩双开销 海量数据传输、日志归档

七、进阶用法

1. 同步 API

import { gzipSync, gunzipSync } from "zlib";
const compressed = gzipSync(Buffer.from("hello world"));
console.log("同步压缩:", compressed.length);
console.log("解压:", gunzipSync(compressed).toString());

2. 流式压缩(处理大文件)

import { createGzip, createGunzip } from "zlib";
import { createReadStream, createWriteStream } from "fs";

createReadStream("input.txt")
  .pipe(createGzip())
  .pipe(createWriteStream("input.txt.gz"));

createReadStream("input.txt.gz")
  .pipe(createGunzip())
  .pipe(createWriteStream("output.txt"));

3. 压缩 WebSocket 消息(小体积传输)

  • 客户端发送时:msgpack.encodegzip → 发送
  • 服务端接收时:解 gzipmsgpack.decode

八、总结

  • msgpack-lite:结构优化,替代 JSON。
  • zlib:压缩算法,适合冗余数据。
  • 组合 = 最大压缩率,适合网络传输和存储。

👉 如果数据量小,直接用 msgpack-lite 就够了。
👉 如果数据量大、重复多,推荐 msgpack-lite + zlib

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐