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

时间:2016-01-14 09:51:52

标签: javascript google-chrome google-chrome-extension

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

我不确定传递API的消息应该用于此,因为我不太了解端口API和普通chrome.runtime API之间的区别。我可以使用runtime.sendmessage来处理Port.postMessage吗?任何可能让我选择其中一个的重大差异?

1 个答案:

答案 0 :(得分:6)

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

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

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

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

端口可能有三个方面让我觉得很有意思。

  1. sendMessage广播操作。

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

    如果是tabs.sendMessage,它会默认发送到该标签中的所有框架。您可以指定frameId ,如果您知道,但假设您没有,并且您正在向所有帧广播,那么确定哪个帧是正确的 - 您可以维护该框架的端口。

  2. 开放端口保持Event Page清醒。如果您正在执行可能会卸载事件页面的异步操作,这将非常有用。如果你真的不关心事件页面保持清醒,这也是一个缺点 - 它阻止了

    提供的改进
  3. 一个端口是一个"死亡警报":如果另一端的上下文不再存在(例如卸载了上下文脚本的页面),你&# 39;将由onDisconnect通知

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

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