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

我不确定应该为此使用什么消息传递 API,因为我不太了解 Port API 和普通 chrome.runtime API 之间的区别。有什么我不能用 runtime.sendmessage 做而我可以用 Port.postMessage 做的事情吗?任何可能使我选择其中之一的主要差异?

最佳答案

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

单个消息遵循相同的方案,并且不关心调用之间的状态:
sendMessage -> onMessage (可选 ->) sendResponse -> sendMessage 回调

您可以通过该计划做任何事情。

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

  • sendMessage 是一个广播操作。

    runtime.sendMessage 的情况下,它被发送到作为扩展一部分的所有事件页面。通常,只有一个人会听(背景页面),但每个人都会收到。因此,如果您打开了一个弹出窗口或一个选项页面 - 每个人都会收到它。您可以使用端口来节省一点资源,或隔离页面的实例。

    tabs.sendMessage 的情况下,默认情况下它将发送到该选项卡中的所有帧。如果您知道,您可以指定 frameId,但假设您不知道,并且您正在向所有帧广播,然后确定哪个帧是正确的 - 您可以维护该帧的端口。
  • 一个开放的端口使 Event Page 保持清醒。如果您正在执行有风险卸载事件页面的异步操作,这会很有用。如果您真的不关心事件页面保持清醒,这也是一个缺点 - 它会阻止
  • 提供的改进
  • 端口是“死亡警报”:如果另一端的上下文不再存在(例如,带有上下文脚本的页面被卸载),您将收到 onDisconnect 的通知。

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

    出于您的目的,这将是从内容脚本(当它启动连接时)两次调用 sendMessage 并从 sendResponse 的后台回复。如果需要,请不要忘记 nuance about async responses

    关于javascript - runtime.sendMessage 和 port.postMessage 的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34786356/

    10-11 20:22