多标签页同步(BroadcastChannel)
灵感:能力工具箱 broadcast-sync(pkg: broadcast-channel)。
同一浏览器内多个 CRM 标签页之间,广播「草稿已保存 / 列表需刷新」等轻量信号,避免一页改了另一页还是旧数据。
何时使用
- 用户常开多个客户详情/列表页
- 一页保存草稿后,其他页提示刷新或自动重载本地缓存
- 需要同源跨 Tab 通信,不必上 WebSocket
硬约束
- 使用原生
BroadcastChannel,或broadcast-channel包做兼容;频道名固定且带业务前缀(如crm:draft-sync)。 - 消息为可结构化克隆的纯 JSON(
type+ 少量 id/时间戳),不要广播整份大草稿正文(大内容走 localStorage/IndexedDB,这里只发信号)。 - 发送端忽略自己的回环(若库会回投);接收端按
type分支处理。 - 组件卸载 / 路由离开时
close()频道,防泄漏。 - 不发起网络请求;跨浏览器配置文件不同步属预期。
推荐实现要点
export type DraftSyncMsg =
| { type: 'draft-saved'; customerId: string; at: number }
| { type: 'list-invalidate'; at: number }
const CHANNEL = 'crm:draft-sync'
export function createDraftSync(onMessage: (msg: DraftSyncMsg) => void) {
const bc = new BroadcastChannel(CHANNEL)
bc.onmessage = (ev) => {
const data = ev.data as DraftSyncMsg
if (!data || typeof data.type !== 'string') return
onMessage(data)
}
return {
post(msg: DraftSyncMsg) {
bc.postMessage(msg)
},
close() {
bc.close()
},
}
}
// 保存成功后:
// sync.post({ type: 'draft-saved', customerId, at: Date.now() })
// 其他页:toast「其他标签页已更新该客户」或重新 readLocalDraft(customerId)
> 若需 IE/旧环境,再用 broadcast-channel npm 包替换 new BroadcastChannel,API 语义保持一致。
Agent 步骤
- 封装
createDraftSync,在布局或 store 层挂载一次。 - 草稿保存成功
post;他页onMessage刷新对应缓存。 - 自测:开两个标签,A 保存后 B 收到信号(可用 console / toast 验证)。
附加
- README.md · reference.md · templates/usage.md