MessageChannel、BroadcastChannel、storage 与 postMessage 如何选择?

先理解原理和示例,再练习完整口述与追问。

成对端口、同源广播、存储事件、指定窗口;结构化消息;来源权限、关闭与恢复;不把通信当持久化。

MessageChannel 创建两个 MessagePort,适合建立双向专用消息通道,也可把端口转交给 Worker 或窗口。BroadcastChannel 让满足来源与存储分区等条件的上下文按频道名广播,适合标签页同步。storage 事件可把其他相关页面的存储变化作为通知,写入页本身通常不收到同一次事件。postMessage 适合已持有目标窗口引用的受控通信,跨源时必须核对来源与目标。

js
function openNoticeChannel(receive) {
  const channel = new BroadcastChannel('account-notice')
  channel.onmessage = event => {
    if (event.data?.type === 'session-changed') receive()
  }
  return {
    notify() { channel.postMessage({ type: 'session-changed' }) },
    close() { channel.close() }
  }
}

消息只通知“可能已变化”,接收方仍向可信服务重新确认会话。需要最终一致状态时,从权威数据源恢复,而不是把广播当数据库。

通道名不是访问控制;同源页面也可能不可信。旧环境支持、分区、重连和页面关闭都要考虑,不能承诺所有标签页必收到消息。

专用端口用 MessageChannel,相关标签页通知可用 BroadcastChannel,存储事件用于适合的兼容场景,跨窗口用校验严格的 postMessage。消息包含类型和必要关联 ID,执行校验并关闭通道,关键状态从服务端恢复。