runtime.sendMessage 和 port.postMessage 之间的区别
Difference between runtime.sendMessage and port.postMessage
我正在开发Chrome扩展程序,并且即将在我的背景页面和内容脚本之间实现一些消息传递,它将需要大约3条消息(内容->后台->内容->背景),它们都以同步顺序发生。
我不确定我应该为此使用什么消息传递 API,因为我并不真正了解端口 API 和普通 chrome.runtime
API 之间的区别。 有什么我不能用runtime.sendmessage
做的事情,我可以用Port.postMessage
做什么吗?有什么重大差异可能让我选择一个而不是另一个吗?
端口是可重复使用的双向连接。
单个消息遵循相同的方案,并且不关心调用之间的状态:
sendMessage
-> onMessage
(可选 ->)sendResponse
-> sendMessage
回调
您可以通过该方案做大多数事情。
我能想到的 Ports 可能有三个方面使它们变得有趣。
-
sendMessage
是广播操作。如果出现
runtime.sendMessage
,则会将其发送到属于扩展的所有活动页面。通常,只有一个人会听(背景页面),但每个人都会收到它。因此,如果您打开了一个弹出窗口或选项页面 - 每个人都会收到。您可以使用端口来节省少量资源,或隔离页面的实例。如果
tabs.sendMessage
,默认情况下它将发送到该选项卡中的所有帧。如果您知道,可以指定一个frameId
,但假设您不知道,并且您正在广播到所有帧,然后确定哪个帧是正确的 - 您可以维护该帧的端口。 -
打开的端口使事件页面保持唤醒状态。如果您正在执行一些有卸载事件页面风险的异步操作,这会很有用。如果您并不真正关心活动页面保持清醒,这也是一个缺点 - 它会阻止
-
端口是一个"死亡警报":如果另一端的上下文不复存在(例如,带有上下文脚本的页面被卸载),您将收到
onDisconnect
的通知。
除非您需要上述任何一项,否则您可以使用更简单的sendMessage
- onMessage
通信。
出于您的目的,这将是从内容脚本sendMessage
的两个调用(因为它启动连接)和从后台回复 sendResponse
.如果需要,不要忘记异步响应的细微差别。
- 全局变量和全局对象的属性之间有什么区别吗
- JavaScript中的函数和对象之间没有区别吗?
- 在下划线中使用_(obj).map(callback)和_.map(obj,callback)之间的区别
- javascript函数的:和=之间的区别
- 什么's本地node.js服务器和python简单http服务器之间的区别
- 函数中this和var之间的区别
- “util.inherits”和在NodeJS中扩展原型之间的区别
- Math.min()和Math.max()之间有什么区别?在Javascript中
- webpack开发模式和生产构建模式之间有什么区别
- servlet和代理servlet之间的区别
- Javascript 类型未定义和 void 之间的区别
- Javascript-defineProperty和直接在对象上定义函数之间的区别
- 关于承诺/A+规范,术语“当时可”和“承诺”之间有什么区别
- 布局引擎和javascript引擎之间的区别
- 什么's extjs中的mon()和on()之间的区别
- type=text/javascript和language=javascript之间的区别
- 函数()和新函数()之间的区别
- JavaScript中let和var之间的区别
- 蓝鸟的done()和spread()之间的区别
- Node.js HTTP/NET——连接和请求之间的区别