众多跨标签页通信方式,你知道哪些?(二)

书接上回,由于时间原因,还有几种情况没有总结,今天抽时间总结一下,其他情况请查看这里,众多跨标签页通信方式,你知道哪些?

以下则是常用的通信方法

  • BroadCast Channel
  • Service Worker
  • LocalStorage + window.onstorage 监听
  • Shared Worker 定时器轮询(setInterval)
  • IndexedDB 定时器轮询(setInterval)
  • cookie 定时器轮询(setInterval)
  • window.open + window.postMessage(非同源也可)
  • Websocket (非同源也可)

IndexedDB 定时器轮询(setInterval)

  • IndexedDB是一种底层的API,用于在客户端存储大量的结构化数据。
  • 它是一种事务型数据库系统,是一种基于JavaScript面向对象数据库,有点类似于NoSQL(非关系型数据库)。
  • IndexDB本身就是基于事务的,我们只需要指定数据库模式,打开与数据库的连接,然后检索和更新一系列事务即可。

indexedDB的详细使用请看这里

下面就简单演示先通信的过程,就是在两个同源页面进行获取数据。

js 复制代码
// 页面一
<button>新增</button>
<button>查询</button>
<button>删除</button>
<button>修改</button>
<script src="db.js"></script>
js 复制代码
// 页面二
<script>
    function openDB() {
      return new Promise((resolve,reject) => {
        const dbRequest = indexedDB.open("zhDB", 3)
        let db = null
        dbRequest.onsuccess = function(event) {
          db = event.target.result
          resolve(db)
        }
      })
    }
    const getAllData = async (db) => {
      return new Promise((resolve, reject) => {
        const transaction = db.transaction("users", "readwrite")
        const store = transaction.objectStore("users")
        const res = store.getAll()
        res.onerror = () => {
          reject([])
        }

        res.onsuccess = () => {
          resolve(res.result)
        }
      })
    }

    let infoData = []
    openDB().then(db => {
      setInterval(async () => { 
        const data = await getAllData(db)
        if(infoData.length !== data.length) {
          infoData = data
          console.log("infoData", infoData)
        }
      }, 1000)
    })
</script>

具体代码请访问\]([cross-page-communication/IndexDB at main · zhang-glitch/cross-page-communication · GitHub](https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fzhang-glitch%2Fcross-page-communication%2Ftree%2Fmain%2FIndexDB "https://github.com/zhang-glitch/cross-page-communication/tree/main/IndexDB")) ## cookie 定时器轮询(setInterval) mdn对于cookie各个属性及注意事项讲的非常清楚,可以在复习一下。[cookie](https://link.juejin.cn?target=https%3A%2F%2Fdeveloper.mozilla.org%2Fzh-CN%2Fdocs%2FWeb%2FHTTP%2FCookies "https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies") 这种跨页面通信方式也是在同源页面下才可以使用的。 ```js // 页面一 ``` ```js // 页面二 ``` ![cookie通信.gif](https://file.jishuzhan.net/article/1767735666105389058/5ea52aed6a02ca8634d82620ed144516.webp) ## window.open + window.postMessage **window.postMessage()** 方法可以安全地实现跨源通信。所以这种方式也是一种可以在非同源的页面进行通信的方式。 这里用到了`window.open`来打开一个页面,因为我们在向其他页面发送消息时,需要拿到目标页面的引用。[具体请看mdn](https://link.juejin.cn?target=https%3A%2F%2Fdeveloper.mozilla.org%2Fzh-CN%2Fdocs%2FWeb%2FAPI%2FWindow%2Fopen "https://developer.mozilla.org/zh-CN/docs/Web/API/Window/open") 通信的大致过程就是 * 我们通过`window.open`打开target页面。 * 获取到target页面引用,然后调用`postMessage`方法,该方法参数一是发送的数据,参数二是哪些源可以接收到该消息,**该参数指定目标页面必须和指定的源协议,域名,端口号一致才可以监听到消息**。 * 目标页面接收到消息后,对比`event.origin`,如果是发送方则可以使用`postMessage`回复消息。 ```js // 页面一 ``` ```js // 页面二 ``` ![postMessage.gif](https://file.jishuzhan.net/article/1767735666105389058/d9b93d88d4f28ceb3fd64309df64b832.webp) ## Websocket 在我们跨标签页通信中,WebSocket服务器就相当于中间人。就像`Service Worker`,`Shared Worker`通信方式一样,当我们接收到一个页面传递来的消息后,我们再将消息分发给其他页面。这也得益于websocket强大的服务器向客户端主动发送消息的能力。 **这种方式也是可以在非同源页面进行通信的。** ```js // 创建一个websocket服务器,这里使用ws快速创建 const {WebSocketServer} = require("ws") // 创建wb服务器 const wbss = new WebSocketServer({ port: 3000 }) // 保存客户端链接实例 const clients = [] // 客户端连接时触发 wbss.on("connection", (client) => { clients.push(client) console.log("clients:1 客户端连接数", clients.length); // 绑定当前客户端连接,获取消息 client.on('message', function message(data) { console.log('data', data); // 将消息传递给其他客户端 clients.forEach(c => { if(c !== client) { c.send(data) } }) }); // 客户端断开连接(关闭或者刷新) client.on("close", () => { const findIndex = clients.findIndex(c => c === client) clients.splice(findIndex, 1) console.log("clients:2 客户端连接数", clients.length); }) }) ``` ```js // 页面一 ``` ```js // 页面二 ``` ![websocket.gif](https://file.jishuzhan.net/article/1767735666105389058/c75a81ea37a6a0979e110f97844c73e0.webp) 所有的案例代码请访问这里 [zhang-glitch/cross-page-communication: 跨页面通信方案总结 (github.com)](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fzhang-glitch%2Fcross-page-communication "https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fzhang-glitch%2Fcross-page-communication")) ## 总结 以上这八种方法梳理了常见的跨标签页面通信的过程,开发中一般对于同源页面使用`LocalStorage + window.onstorage 监听`,`BroadCast Channel`这两种方式,对于非同源页面使用`window.open + window.postMessage`这种方式即可。其他方式了解即可。 其实这种通信方式有一些共性,`indexedDB, cookie, localStorage`方式,他们都是浏览器存储方式,同源页面可以获取到这些内容,因此就可以进行通信。`service worker, shared worker, websocket`他们都是通过一个中转人,通过接收消息,然后在进行消息分发。`postMessage, BroadCast Channel`他们就是通过js内置的消息通信方式进行通信。 ## 往期年度总结 * [四年沿海城市,刚毕业,一年3家公司](https://juejin.cn/post/7310895905573716005 "https://juejin.cn/post/7310895905573716005") * [七月仿佛又回到了那一年(2023年中总结)](https://juejin.cn/post/7254361990076055589 "https://juejin.cn/post/7254361990076055589") * [一位初入职场前端仔的年度终结 \<回顾2022,展望2023\>](https://juejin.cn/post/7188374796114067511 "https://juejin.cn/post/7188374796114067511") * [大学两年半的前端学习](https://juejin.cn/post/7046248406464856100 "https://juejin.cn/post/7046248406464856100") ## 往期文章 * [众多跨标签页通信方式,你知道哪些?](https://juejin.cn/post/7340109700767383604 "https://juejin.cn/post/7340109700767383604") * [反调试吗?如何监听devtools的打开与关闭](https://juejin.cn/post/7330021813823750159 "https://juejin.cn/post/7330021813823750159") * [因为原生,选择一家公司(前端如何防笔试作弊)](https://juejin.cn/post/7301908233291300900 "https://juejin.cn/post/7301908233291300900") * [结合开发,带你熟悉package.json与tsconfig.json配置](https://juejin.cn/post/7298294389478506548 "https://juejin.cn/post/7298294389478506548") * [如何优雅的在项目中使用echarts](https://juejin.cn/post/7294541220440752165 "https://juejin.cn/post/7294541220440752165") * [如何优雅的做项目国际化](https://juejin.cn/post/7293797226933764134 "https://juejin.cn/post/7293797226933764134") * [近三个月的排错,原来的憧憬消失喽](https://juejin.cn/post/7292036126269063178 "https://juejin.cn/post/7292036126269063178") * [带你从0开始了解vue3核心(运行时)](https://juejin.cn/post/7291955076100620342 "https://juejin.cn/post/7291955076100620342") * [带你从0开始了解vue3核心(computed, watch)](https://juejin.cn/post/7275550540620365878 "https://juejin.cn/post/7275550540620365878") * [带你从0开始了解vue3核心(响应式)](https://juejin.cn/post/7274072378606174263 "https://juejin.cn/post/7274072378606174263") * [3w+字的后台管理通用功能解决方案送给你](https://juejin.cn/post/7269225865619816483 "https://juejin.cn/post/7269225865619816483") * [入职之前,狂补技术,4w字的前端技术解决方案送给你(vue3 + vite )](https://juejin.cn/post/7251878440327512124 "https://juejin.cn/post/7251878440327512124") ## 专栏文章 * [重学vue及其生态](https://juejin.cn/column/7036633477013307423 "https://juejin.cn/column/7036633477013307423") * [前端面试](https://juejin.cn/column/7085181986347679751 "https://juejin.cn/column/7085181986347679751") * [前端工程化](https://juejin.cn/column/7215977393697587259 "https://juejin.cn/column/7215977393697587259") * [amis 低代码实战](https://juejin.cn/column/7171775932809052174 "https://juejin.cn/column/7171775932809052174") * [协议与安全](https://juejin.cn/column/7090398104549064718 "https://juejin.cn/column/7090398104549064718") * [重学react](https://juejin.cn/column/7073656450874081316 "https://juejin.cn/column/7073656450874081316") * [重学nodejs](https://juejin.cn/column/7036633282204663822 "https://juejin.cn/column/7036633282204663822") * [工作总结](https://juejin.cn/column/7133877511707951111 "https://juejin.cn/column/7133877511707951111") ## 结语 本篇文章到此就结束了,欢迎在评论区交流。 🔥如果此文对你有帮助的话,欢迎💗**关注** 、👍**点赞** 、⭐**收藏** 、**✍️评论,** 支持一下博主\~

相关推荐
哟哟耶耶40 分钟前
React-04React组件状态(state),构造器初始化state以及数据读取,添加点击事件并更改state状态值
前端·javascript·react.js
kiramario1 小时前
用IconContext.Provider修改react-icons的icon样式
前端·javascript·react.js
destinyol1 小时前
React首页加载速度优化
前端·javascript·react.js·webpack·前端框架
程序员小续1 小时前
React 多个 HOC 嵌套太深,会带来哪些隐患?
java·前端·javascript·vue.js·python·react.js·webpack
大猫会长1 小时前
用AbortController取消事件绑定
前端
程序员小杰@2 小时前
AI前端组件库Ant DesIgn X
开发语言·前端·人工智能
致微2 小时前
Vue项目 bug 解决
前端·vue.js·bug
慕斯策划一场流浪3 小时前
fastGPT—nextjs—mongoose—团队管理之部门相关api接口实现
前端·javascript·html·fastgpt部门创建·fastgpt团队管理·fastgpt部门成员更新·fastgpt部门成员创建
我自纵横20234 小时前
事件处理程序
开发语言·前端·javascript·css·json·ecmascript
坊钰4 小时前
【MySQL 数据库】数据类型
java·开发语言·前端·数据库·学习·mysql·html