BroadcastChannel 实现跨页面实时通讯

本文讲述了如何在A页面点击编辑后,通过BroadcastChannel进行浏览器跨页面通信,B页面编辑后发送更新消息,A页面监听并自动刷新的方法,利用`BroadcastChannel.postMessage`和`addEventListener`实现双向通信。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

需求:A页面上点击编辑,是跳转到一个新的B页面,这个B页面编辑之后,A页面要自动刷新,在不使用仓库的情况如何实现的呢?

实现思路:使用BroadcastChannel来实现浏览器跨页面通信,B页面编辑保存发起通信,A页面监听通信来调用刷新的方法

实现方法:

1、新建一个文件夹crossMsg.js

const channel = new BroadcastChannel('channel') //使用构造函数创建一个实例

export function sendMsg(type) {   // 发起通信
  channel.postMessage(type)
}

export function listenMsg(callback) {  // 监听通信
  channel.addEventListener('message', (e) => { 
    callback && callback(e.data)
  })
}

2、A页面调用监听通讯的方法

import { listenMsg } from './crossMsg'

listenMsg((type) => {
  console.log(type) // 'update'
})

3、B页面调用发送通讯的方法

import { sendMsg } from "./crossMsg";

sendMsg('update')

补充:

BroadcastChannel 接口代理了一个命名频道,可以让指定 origin 下的任意 browsing context 来订阅它。它允许同源的不同浏览器窗口,Tab 页,frame 或者 iframe 下的不同文档之间相互通信。通过触发一个 message 事件,消息可以广播到所有监听了该频道的BroadcastChannel 对象。

构造函数:BroadcastChannel  创建一个链接到命名频道的对象。

属性:该接口会从它的父级 browsing context 继承属性。

BroadcastChannel.name  频道名称

方法:

BroadcastChannel.postMessage()

向所有监听了相同频道的 BroadcastChannel 对象发送一条消息,消息内容可以是任意类型的数据。

BroadcastChannel.close()

关闭频道对象,告诉它不要再接收新的消息,并允许它最终被垃圾回收。

事件:

message 

当频道收到一条消息时触发。 也可以使用 onmessage 属性访问。

messageerror

当频道收到一条无法反序列化的消息时触发。 也可以使用 onmessageerror 属性访问。

事件处理程序

BroadcastChannel.onmessage 

事件处理器,用于定义当该对象上触发了 message 事件时要执行的函数。

BroadcastChannel. onmessageerror 

事件处理器,用于定义当该对象上触发了类型为 MessageError 的 MessageEvent 事件时要执行的函数。当接收到一条无法反序列化的消息时会触发此事件。

### 解决方案概述 为了实现无延迟的跨页面通信,可以考虑几种不同的方法来优化或替代 `window.postMessage`。这些方法不仅能够减少延迟,还能提高通信效率。 #### 使用 Shared Worker 实现即时通信 Shared Worker 是一种可以在多个浏览上下文之间共享的工作线程。这种方式允许不同窗口或标签页之间的消息传递更加高效和快速[^1]。 ```javascript // shared-worker.js const connections = []; onconnect = function(e) { const port = e.ports[0]; connections.push(port); port.onmessage = function(event) { broadcast(event.data); }; function broadcast(data) { connections.forEach(connection => connection.postMessage(data)); } }; ``` 在各个页面中连接到这个 worker: ```javascript const myWorker = new SharedWorker('shared-worker.js'); myWorker.port.start(); myWorker.port.onmessage = function(event) { console.log(`Received message from other page: ${event.data}`); }; function sendMessageToOtherPages(message) { myWorker.port.postMessage(message); } ``` 这种方法绕过了主文档流中的潜在瓶颈,提供了更为流畅的消息传输机制。 #### 利用 Broadcast Channel API Broadcast Channel 提供了一种简单的方式,在同一个源下的所有浏览器选项卡间广播消息。它具有较低级别的开销,并且设计上就是为了支持实时通讯需求。 ```javascript // 发送端 const bcSender = new BroadcastChannel('example_channel'); bcSender.postMessage('Hello, this is a test message.'); // 接收端 const bcReceiver = new BroadcastChannel('example_channel'); bcReceiver.onmessage = (e) => { console.log(`Message received: ${e.data}`); }; ``` 此接口非常适合用于简单的跨页面通知场景,而且性能表现良好。 #### 考虑 WebRTC 数据通道 对于更高带宽的需求或是更复杂的交互应用来说,WebRTC 的数据通道提供了一个强大的解决方案。它可以建立 P2P 连接来进行高效的双向数据交换,适用于多媒体聊天室或其他需要低延迟的应用程序开发环境。 然而需要注意的是,设置 WebRTC 可能涉及到更多的配置工作和技术细节处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cherry014

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值