选utf-16编码可使lz-string压缩率达25%–40%,扩容2.5–4倍;须先json.stringify再compresstoutf16,读取时反向操作并加try-catch防静默失败,配合字段精简可进一步提升效果。

直接压缩就能扩容,关键在选对方法和避开常见坑。
选 UTF-16 编码获得最高压缩率
LZ-string 提供多种输出格式,其中 compressToUTF16 / decompressFromUTF16 压缩率最高,实测常达原始体积的 25%–40%,相当于容量提升 2.5–4 倍。Base64 虽兼容性更好,但压缩率通常只到 45%–55%,扩容效果打折扣。
- 适合纯前端场景(如单页应用缓存配置、表单草稿、离线日志)
- 压缩后仍是合法 JavaScript 字符串,可直接存入 localStorage,无需额外转义
- 注意:不能用于跨语言环境(如传给后端 Java/Python 解压),仅限浏览器内闭环使用
先序列化再压缩,顺序不能反
localStorage 只接受字符串,所以复杂数据(对象、数组)必须先 JSON.stringify,再压缩;读取时按相反顺序:解压 → JSON.parse。
- 错误写法:
LZString.compress({ name: '张三', age: 28 })—— 对象无法被压缩函数识别 - 正确写法:
const compressed = LZString.compressToUTF16(JSON.stringify(userData)) - 解压后务必用
JSON.parse(LZString.decompressFromUTF16(stored))恢复结构
加 try-catch 防止静默失败
压缩本身不会报错,但解压失败时返回 null,且 localStorage 写满时 setItem 会直接抛 QuotaExceededError。不捕获会导致数据丢失无提示。
- 写入时包裹 try-catch:
try { localStorage.setItem('cfg', compressed); } catch (e) { console.warn('存储失败,可能已超限'); } - 读取时检查解压结果:
const raw = localStorage.getItem('cfg'); const data = raw ? LZString.decompressFromUTF16(raw) : null; return data ? JSON.parse(data) : null;
搭配精简字段进一步放大扩容效果
压缩率受文本重复度影响大。原始数据若含大量冗余字段(如 API 返回的完整对象),可先做轻量清洗:
- 剔除服务端返回但前端不用的字段(如
created_at、updated_by) - 用短键名替代长键名(
{ u: 'admin', r: 1 }替代{ username: 'admin', role: 1 }) - 日期统一转为时间戳数字,比 ISO 字符串省 10+ 字节
- 这些操作本身不压缩,但能显著提升 LZ-string 的压缩效率










