html5与websocket需手动协同实现本地数据变更推送:通过拦截indexeddb事务捕获变更并暂存,连接后批量发送、服务端确认更新状态,离线时重试并幂等处理,避免序列化错误与连接异常。

HTML5 本身不提供“本地数据库”(如 IndexedDB)的变更自动监听与推送能力,WebSocket 也只是双向通信通道,二者需手动协同实现“本地数据变更 → 推送到后端”。关键不在技术是否支持,而在于如何设计可靠的变更捕获、序列化、冲突预防和重连机制。
用 IndexedDB Transaction 监听写操作
IndexedDB 没有原生的 change event,但所有写操作(add、put、delete)都必须通过 transaction 执行。可在封装的数据库操作层统一拦截:
- 为每个写操作生成唯一变更 ID(如 UUID + 时间戳)
- 记录表名、操作类型(create/update/delete)、主键、新旧值(update 时)、时间戳
- 将变更暂存到一个专用的
changesobject store(带 status 字段:pending/sent/acked) - 避免在事务中直接发 WebSocket —— 应在
transaction.oncomplete后异步触发推送
WebSocket 连接管理与变更批量发送
WebSocket 易断连,不能每次变更都单独发一条消息。推荐做法:
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
- 连接建立后,先同步本地 pending 变更(按时间戳排序),再开启监听
- 使用节流(throttle)或微任务队列聚合变更(如 100ms 内多次变更合并为一个数组)
- 发送格式建议 JSON:
{"type":"batch","changes":[{...},{...}],"clientId":"abc123"} - 服务端成功处理后,返回确认消息(含变更 ID 列表),前端更新
changesstore 中对应项的 status 为acked
处理离线与冲突场景
用户可能断网后继续操作,需保障最终一致性:
- 未 ack 的变更保留在
changesstore 中,页面重连后自动重发(带重试次数限制,如 ≤3 次) - 服务端收到重复变更(相同变更 ID)应幂等处理,或返回已存在提示
- 对同一记录的并发修改(如 A 和 B 同时改同一条 note),前端可采用最后写入胜出(LWW),或由服务端返回版本号/时间戳做乐观锁校验
- 必要时提供手动“同步状态”按钮,显示 pending 数量和失败原因
避免常见陷阱
实际落地中容易忽略的细节:
- 不要监听 IndexedDB 的 onupgradeneeded 或 open 成功事件来推全量数据 —— 这不是变更推送,而是初始化同步
- WebSocket
send()在连接关闭时会抛错,务必用ws.readyState === WebSocket.OPEN做前置判断 - IndexedDB 的 value 若含函数、undefined、循环引用,JSON.stringify 会失败,推送前需用结构化克隆或自定义序列化清洗
- 不要把 WebSocket 实例挂全局变量;应在模块内单例管理,并暴露
sendChange()、onAck()等清晰接口
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!








