这是一个有趣的问题。
我们可以尝试这些 api:
postMessage、sessionStorage、localStorage、webRtc。
BroadcastChannel 非常适合:
BroadcastChannel 允许来自同一来源但其他来源的脚本
浏览上下文(windows、workers)以相互发送消息。
BroadcastChannel 接口代表一个命名频道,任何
给定来源的浏览上下文可以订阅。它允许
不同文档之间的通信(在不同的窗口、标签、
相同来源的框架或 iframe)。消息通过一个广播
在侦听的所有 BroadcastChannel 对象上触发的消息事件
频道。
它与 postMessage api 的不同之处在于子窗口不打算在父页面中声明。这样就没有父母和孩子了。
发送示例:
new BroadcastChannel('myapp').postMessage('Hello?');
接收示例:
new BroadcastChannel('myapp').addEventListener('message', function(e){
console.log(e.data)
})
这样,我们可以统计标签页,甚至可以将当前的活跃状态告知其他标签页等。
自此帖子以来的使用反馈。 BroadcastChannel api 非常简单,但允许重新思考架构。
这允许import 模块相互通信,这简化了脚本的组合。
我不觉得需要 webpacked 组合脚本来构建复杂的东西。我们可以通过通道共享对象(以 json 编码),在需要时调用“服务”,分离逻辑、模板、工厂、事件、服务,更容易。
这是针对内存使用和性能的。我们可以创建多个通道并行馈送一些大数据流,这对 ram/cpu 和接口响应能力几乎没有影响。
变量少,逻辑少,广播的数据被直接丢弃。编码风格与 websockets 非常相似,event-driven,这只是本地套接字。
事件驱动架构 (EDA) 是一种软件架构范式
促进生产、检测、消费和反应
事件。
[MDN] Broadcast_Channel_API
https://caniuse.com/#feat=broadcastchannel