美文网首页
《红皮书》跨上下文消息

《红皮书》跨上下文消息

作者: 我叫Aliya但是被占用了 | 来源:发表于2022-04-15 11:08 被阅读0次

官网文档 https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage

otherWindow.postMessage(message, targetOrigin, [transfer]);
  • otherWindow:其他窗口的引用,如 iframe 的 contentWindow、window.opener 等
  • message:会被结构化克隆算法序列化
  • targetOrigin:目标窗口的 Origin 或 *
  • transfer:是一串和 message 同时传递的 Transferable 对象(ArrayBuffer、MessagePort 和 ImageBitmap)(大对象移交指针?)
var popup = window.open("http://www.target.com");
popup.postMessage("ping", "http://www.target.com");
window.addEventListener(
  "message",
  function receiveMessage({ data, origin, source }) {
    if (origin !== "http://www.target.com") return;
    console.log("消息发送者的 window 引用:", source);
    console.log("接收的消息:", data); // pong
  },
  false
);

// http://www.target.com
window.addEventListener(
  "message",
  function receiveMessage({ data, origin, source }) {
    if (origin !== "http://www.origin.com") return;
    source.postMessage("pong", origin);
  },
  false
);

window.addEventListener('message')参数:

  • data 接受到的数据
  • origin 发送者 origin
  • source 发送者的 window 引用

对 origin 和 source 的检查有助于避免跨站点脚本攻击

MessageChannel

postMessage 是基于 MessageChannel 实现的,MessageChannel 本身可以用于两个 works 间通讯。

> new MessageChannel()
< MessageChannel {port1: MessagePort, port2: MessagePort}
  port1: MessagePort {onmessage: null, onmessageerror: null, onclose: null, close: f, postMessage: f, start: f}
  port2: MessagePort {onmessage: null, onmessageerror: null, onclose: null, close: f, postMessage: f, start: f}

将 port1 和 port2 分别传给两个 works,works 使用接收的 port 进行消息监听和发送,就可以通过 MessageChannel 进行通信。

BroadcastChannel

基于 name 为一组通讯。两个 works 都使用相同 name 初始化一个 BroadcastChannel,在其实例上监听和发送消息就以彼此通信。

> new BroadcastChannel('test')
< BroadcastChannel {name: 'test', onmessage: null, onmessageerror: null, close: f, postMessage: f}

works 的创建消耗大(时间或空间),基于 BroadcastChannel 发消息时要确保 works 已经初始化完成(已经监听上),以免消息没人处理。

数据的传输

postMessage 会将对象进行结构化克隆(Error 对象、Function 对象或 DOM 节点会抛出错误)后再传输,当对象比较复杂时会比较消耗性能,转为字符串可以缓解这种消耗和兼容老浏览器。

在数据很大时可以使用 可转移对象(transferable objects),比如 postMessage 的 transfer 参数,可以被转移的对象有:

  • ❑ ArrayBuffer ❑ MessagePort ❑ ImageBitmap ❑ OffscreenCanvas

共享数据 SharedArrayBuffer 兼容性有问题

相关文章

  • 《红皮书》跨上下文消息

    官网文档 https://developer.mozilla.org/zh-CN/docs/Web/API/Win...

  • js postMessage不工作

    JavaScript高级程序设计 第四版 20章第二节内容。 20.2 跨上下文消息 内容学习笔记 故障现场 ...

  • 实现领域驱动设计-集成限界上下文

    概念 领域模型是以限界上下文为边界的,集成限界上下文是跨上下文的,所以领域模型不是重点,本章更多是技术实现的指导。...

  • 消息上下文菜单

    每个PPMESSAGE的座席消息都有一个上下文菜单,可以单独对这个消息进行操作,如复制,重发,删除(删除同时撤回)...

  • 红皮书

    红皮书 一定是打翻了 满满一罐的朱砂 疼痛的手腕,摁不住莫名其妙的话 月亮 游荡在寂寥的街巷 盗走阁楼上的童话 试...

  • 跨上岁月轻骑

    跨上岁月轻骑,整装待发!沉寂太久,是时候出发! 尽管前面会存在许许多多困难栅栏,稳撰僵绳,何所惧?非议也罢,怀疑也...

  • CryptoAlpaca 加密羊驼的红皮书

    这里的红皮书和区块链的白皮书一样。 我们称之为红皮书,因为我们认为 Crypto Game 是基于区块链应...

  • 开卷有益,益处有多大,取决于你会不会读书

    “红皮书你读完了吗?” “必须读完啊,红皮书是前端工程师必读的,好不好?” “你看完这本书记住多少,对你个人技术有...

  • 12.通过消息集成传递

    上一章介绍了有界上下文集成的方法,其中上下文通信主要有消息和rpc调用,这一章主要介绍消息的应用 1.消息传递的基...

  • day2: 魔戒

    阅读时间:30分钟速度:2000字回顾: 关于魔戒前传霍比特人历险记的故事,大部分都记载在西境红皮书中,红皮书是由...

网友评论

      本文标题:《红皮书》跨上下文消息

      本文链接:https://www.haomeiwen.com/subject/pmifertx.html