概述Service Worker 作为独立线程可与受控页面交换消息,进行状态同步与指令下发。使用 `postMessage` 与 `MessageChannel` 实现双向通信,结合 `clients.matchAll` 广播到所有页面。示例// SW 内:广播到所有受控客户端 self.addEventListener('message', async e => { const clientsList = await self.clients.matchAll({ includeUncontrolled: true, type: 'window' }) for (const c of clientsList) c.postMessage({ type: 'update', payload: e.data }) }) // 页面:监听 SW 消息 navigator.serviceWorker.addEventListener('message', e => { if (e.data?.type === 'update') applyUpdate(e.data.payload) }) // 双向:页面向 SW 发送 navigator.serviceWorker.controller?.postMessage({ type: 'ping' }) 工程建议协议与类型:定义消息类型与数据结构;忽略未知消息并记录错误。生命周期:处理控制与非控制页面;在激活与更新期间协调广播。安全与性能:限制来源与频率;对大对象使用 Transferable 并管理释放。参考与验证MDN Service Worker `clients.matchAll` 文档:https://developer.mozilla.org/docs/Web/API/Clients/matchAllMDN `postMessage` 文档:https://developer.mozilla.org/docs/Web/API/Client/postMessage

发表评论 取消回复