像 chrome.runtime.sendMessage 这样的扩展消息传递内部是否使用 JSON.stringify?

saw*_*awa 4 javascript json google-chrome google-chrome-extension

消息可以包含任何有效的 JSON 对象(null、布尔值、数字、字符串、数组或对象)

chrome扩展规范表明后台和内容脚本之间传递的消息可以是Javascript对象,这意味着我们可以在不使用JSON.stringify的情况下传递Javascript对象。这是否意味着 Chrome 在发送消息之前会在内部执行 JSON.stringify ?如果没有,如果我只传递 Javascript 对象而不进行 JSONification,是否会有性能提升?

wOx*_*xOm 8

在 Chrome 中,消息在 Chrome 的 JavaScript shim 层中自动进行 JSON 序列化(字面意思是使用),该层与扩展程序交互,如messages.js 的源代码JSON.stringify中所示。

这同样适用于内部使用Port基于消息传递的 chrome.runtime.sendMessage 和 chrome.tabs.sendMessage 。

这意味着仅传递对象的 JSON 兼容部分:字符串、数字、布尔值、null 以及由列出的类型组成的对象/数组。不支持复杂类型,复杂类型将作为空对象发送,{}例如 DOM 元素、Set、Map、类实例、函数等。

要发送不支持的类型,请手动对其进行序列化/字符串化,例如,如果map = new Map()

  • {data: [...map]}发送时
  • new Map(request.data)收到时

希望 Chrome 有一天能够直接发送更多类型,请参阅https://crbug.com/248548

在 Firefox 中,使用结构化克隆算法,它保留了许多流行的复杂类型,如 Date、RegExp、Blob、File、ArrayBuffer、Map、Set 等。