草稿压缩存储(lz-string)
灵感:能力工具箱 lz-compress(pkg: lz-string)。
把客户草稿 JSON 用 lz-string 压缩成字符串再存 localStorage,缓解配额与大笔记占空间问题。
何时使用
- 跟进笔记长、草稿对象大
localStorage接近配额或频繁 QuotaExceeded- 只需本地草稿,不必上 IndexedDB 的轻量方案
硬约束
- 依赖
lz-string;推荐compressToUTF16/decompressFromUTF16(较适合 localStorage)。 - 读写成对封装;解压失败返回中文原因并允许清空坏数据。
- Key 带版本前缀(如
crm:draft:v1:),便于将来迁移。 - 先
JSON.stringify再压缩;读出先解压再JSON.parse。 - 不把压缩串当加密——仅省空间,敏感数据另议。
推荐实现要点
import LZString from 'lz-string'
const PREFIX = 'crm:draft:v1:'
export function saveDraftCompressed(id: string, data: unknown): { ok: true } | { ok: false; reason: string } {
try {
const raw = JSON.stringify(data)
const packed = LZString.compressToUTF16(raw)
if (!packed) return { ok: false, reason: '压缩失败' }
localStorage.setItem(PREFIX + id, packed)
return { ok: true }
} catch {
return { ok: false, reason: '存储失败(可能超出配额)' }
}
}
export function loadDraftCompressed<T = unknown>(id: string): { ok: true; data: T } | { ok: false; reason: string } {
const packed = localStorage.getItem(PREFIX + id)
if (!packed) return { ok: false, reason: '无草稿' }
try {
const raw = LZString.decompressFromUTF16(packed)
if (!raw) return { ok: false, reason: '解压失败' }
return { ok: true, data: JSON.parse(raw) as T }
} catch {
return { ok: false, reason: '草稿损坏' }
}
}
export function removeDraftCompressed(id: string) {
localStorage.removeItem(PREFIX + id)
}
Agent 步骤
- 安装
lz-string,封装 save/load/remove。 - 与 Immer 草稿更新衔接:produce 后
saveDraftCompressed。 - 自测:大文本存取往返一致;可对比压缩前后
length。
附加
- README.md · reference.md · templates/usage.md