我正在开发一个 Chrome 扩展程序,并且即将在我的后台页面和内容脚本之间实现一些消息传递,它将需要大约 3 条消息(内容 -> 背景 -> 内容 -> 背景),它们都以同步顺序发生。
我不确定应该为此使用什么消息传递 API,因为我不太了解 Port API 和普通 chrome.runtime
API 之间的区别。有什么我不能用 runtime.sendmessage
做而我可以用 Port.postMessage
做的事情吗?任何可能使我选择其中之一的主要差异?
最佳答案
端口是可重用的双向连接。
单个消息遵循相同的方案,并且不关心调用之间的状态:sendMessage
-> onMessage
(可选 ->) sendResponse
-> sendMessage
回调
您可以通过该计划做任何事情。
我可以想到 Ports 的三个方面让它们变得有趣。
sendMessage
是一个广播操作。在
runtime.sendMessage
的情况下,它被发送到作为扩展一部分的所有事件页面。通常,只有一个人会听(背景页面),但每个人都会收到。因此,如果您打开了一个弹出窗口或一个选项页面 - 每个人都会收到它。您可以使用端口来节省一点资源,或隔离页面的实例。在
tabs.sendMessage
的情况下,默认情况下它将发送到该选项卡中的所有帧。如果您知道,您可以指定 frameId
,但假设您不知道,并且您正在向所有帧广播,然后确定哪个帧是正确的 - 您可以维护该帧的端口。 onDisconnect
的通知。 除非您需要上述任何一项,否则您可以使用更简单的
sendMessage
- onMessage
通信。出于您的目的,这将是从内容脚本(当它启动连接时)两次调用
sendMessage
并从 sendResponse
的后台回复。如果需要,请不要忘记 nuance about async responses。关于javascript - runtime.sendMessage 和 port.postMessage 的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34786356/