前端与浏览器 / 进阶
多标签页通信:BroadcastChannel、storage 与锁
比较多标签页通信方案,设计登出通知、状态同步和单实例后台任务。 同步消息容易,同步状态与所有权才是真正难点。
消息不是状态
新打开的标签页收不到历史广播,因此真实状态应存放在服务端、IndexedDB 或其他可读取位置。广播只负责提示状态可能已变化,接收方再重新读取。 消息可能重复、乱序或在页面冻结后延迟到达。为事件增加 id、版本和时间戳,处理函数应具备幂等性。
EXAMPLE / 01BroadcastChannel
const channel = new BroadcastChannel('account-events');
export function announceLogout() {
channel.postMessage({ type: 'logout', at: Date.now(), version: 1 });
}
channel.addEventListener('message', event => {
if (event.data?.type === 'logout') {
clearPrivateState();
location.assign('/login');
}
});把实现拆成可验证的小块
接收逻辑必须容忍重复与延迟
最后回到真实页面检查
互斥任务优先交给 Web Locks 管理