runtime.sendMessage 和 port.postMessage 之间的区别

Difference between runtime.sendMessage and port.postMessage

本文关键字:之间 区别 postMessage port sendMessage runtime      更新时间:2023-09-26

我正在开发Chrome扩展程序,并且即将在我的背景页面和内容脚本之间实现一些消息传递,它将需要大约3条消息(内容->后台->内容->背景),它们都以同步顺序发生。

不确定我应该为此使用什么消息传递 API,因为我并不真正了解端口 API 和普通 chrome.runtime API 之间的区别。 有什么我不能用runtime.sendmessage做的事情,我可以用Port.postMessage做什么吗?有什么重大差异可能让我选择一个而不是另一个吗?

端口是可重复使用的双向连接。

单个消息遵循相同的方案,并且不关心调用之间的状态:

sendMessage -> onMessage(可选 ->)sendResponse -> sendMessage回调

您可以通过该方案做大多数事情。

我能想到的 Ports 可能有三个方面使它们变得有趣。

  1. sendMessage广播操作。

    如果出现runtime.sendMessage,则会将其发送到属于扩展的所有活动页面。通常,只有一个人会听(背景页面),但每个人都会收到它。因此,如果您打开了一个弹出窗口或选项页面 - 每个人都会收到。您可以使用端口来节省少量资源,或隔离页面的实例。

    如果tabs.sendMessage,默认情况下它将发送到该选项卡中的所有如果您知道,可以指定一个frameId,但假设您不知道,并且您正在广播到所有帧,然后确定哪个帧是正确的 - 您可以维护该帧的端口。

  2. 打开的端口使事件页面保持唤醒状态。如果您正在执行一些有卸载事件页面风险的异步操作,这会很有用。如果您并不真正关心活动页面保持清醒,这也是一个缺点 - 它会阻止

  3. 端口是一个"死亡警报":如果另一端的上下文不复存在(例如,带有上下文脚本的页面被卸载),您将收到onDisconnect的通知。

除非您需要上述任何一项,否则您可以使用更简单的sendMessage - onMessage通信。

出于您的目的,这将是从内容脚本sendMessage的两个调用(因为它启动连接)和从后台回复 sendResponse .如果需要,不要忘记异步响应的细微差别。