前端性能监控 sdk 用 localstorage 暂存埋点队列,通过结构化存储(含唯一 id、时间戳等)、容量与过期控制、标记-分批-确认清除上报机制及 localstorage 可用性检测降级,解决网络不可靠时数据不丢失和防重复上报问题。

在前端性能监控 SDK 中,用 localStorage 暂存待上报的埋点队列,核心是解决“网络不可靠时数据不丢失”和“避免重复上报”两个问题。不能直接全量塞进去,得有结构化存储、容量控制和幂等机制。
设计带时间戳和唯一 ID 的结构化队列
每个埋点数据应包含必要元信息,方便去重、排序和过期清理:
-
id:用
crypto.randomUUID()或时间戳 + 随机数生成全局唯一 ID(避免同一事件多次触发重复入队) - timestamp:记录采集时间,用于后续按序上报或超时丢弃
-
type:如
"perf-nav"、"error-js",便于分类处理 - payload:原始埋点内容(建议提前序列化为精简 JSON,避免运行时再处理)
整个队列存为数组,键名推荐固定前缀,例如 "__monitor_queue_v2",避免与其他业务冲突。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
写入前做容量与过期检查
localStorage 容量通常仅 5–10MB,但实际可用更少。需主动控量,防止写满报错或拖慢主线程:
- 每次写入前,先
JSON.parse(localStorage.getItem(key)) || []读取当前队列 - 过滤掉
timestamp超过 24 小时的旧数据(防堆积) - 限制队列长度(如最多 1000 条),超出则
shift()踢出最老的 - 写入用
localStorage.setItem(key, JSON.stringify(queue)),捕获可能的QuotaExceededError并降级(如丢弃最老几条再试)
上报时实现原子性与状态标记
不能“读 → 上报 → 清空”,否则上报中途失败会导致数据丢失。推荐“标记 + 分批 + 确认清除”流程:
- 上报前给每条数据加临时字段
__status: "pending" - 分批发送(如每次 20 条),用
fetch(..., { keepalive: true })提升页面卸载时成功率 - 收到 HTTP 2xx 响应后,从本地队列中 过滤掉已成功上报的 id,再保存回
localStorage - 可额外加简单重试逻辑:对
__status === "pending"且超过 5 分钟未更新的条目,下次启动时重新尝试
兼容性与降级兜底
部分场景下 localStorage 不可用(无痕模式、禁用 JS 存储、iOS Safari 私有浏览),需静默降级:
- 写入前先测试:
try { localStorage.setItem('test', 'x'); localStorage.removeItem('test'); } catch(e) { /* 降级到内存队列 */ } - 降级策略:纯内存队列(页面存活期内有效),配合
beforeunload尝试最后上报 - 避免因存储异常中断 SDK 主流程,所有
localStorage操作必须包裹try/catch
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










