LZ-String 使用 compressToUTF16/decompressFromUTF16 可将 JSON 压缩至原体积 25%–40%,需先 stringify 再压缩,配合字段精简与正确异常处理才能稳定生效。

直接用 LZ-String 压缩 JSON 字符串,选 compressToUTF16 / decompressFromUTF16,能稳定把体积压到原大小的 25%–40%,相当于扩容 2.5–4 倍。关键不在“能不能压”,而在“怎么压才真正有效”。
用对编码格式,压缩率翻倍
LZ-String 提供多种输出格式,但效果差异明显:
- UTF-16 编码(推荐):compressToUTF16 + decompressFromUTF16,实测压缩率最高,尤其适合中文、emoji 等多字节字符,常达原始体积 25%–40%
- Base64 编码:兼容性好,但体积通常为原大小的 45%–55%,扩容效果打折扣
- URI 安全编码:适合传参,但不适用于 localStorage 存储
- 纯字符串或 Uint8Array:前者易用但压缩弱,后者需额外转码,增加复杂度
顺序不能错:先 stringify,再压缩
localStorage 只接受字符串,复杂数据必须按固定流程处理:
- 写入时:JSON.stringify(data) → LZString.compressToUTF16(...) → localStorage.setItem()
- 读取时:localStorage.getItem(...) → LZString.decompressFromUTF16(...) → JSON.parse(...)
- 错误示例:
LZString.compressToUTF16({ name: '张三' })—— 对象无法被识别,会返回空字符串
加 try-catch,避免静默失败
压缩本身不会报错,但解压失败返回 null,setItem 超限时直接抛 QuotaExceededError,不捕获就会丢数据:
立即学习“Java免费学习笔记(深入)”;
- 写入时包一层 try-catch:
try { localStorage.setItem('key', compressed); } catch (e) { console.warn('存储失败,可能已超限'); } - 读取时检查解压结果:
const raw = localStorage.getItem('key'); const json = raw ? LZString.decompressFromUTF16(raw) : null; return json ? JSON.parse(json) : null;
配合字段精简,进一步放大效果
LZ 算法依赖重复模式,原始数据越“干净”,压缩率越高:
- 剔除后端返回但前端不用的字段(如
created_at、updated_by) - 用短键名替代长键名(
{ u: 'admin', r: 1 }替代{ username: 'admin', role: 1 }) - 日期统一转时间戳数字,比 ISO 字符串省 10+ 字节
- 避免存冗余空格或换行——JSON.stringify 时可传
null, 0参数控制格式


















