Chrome扩展程序是如何进行消息传递的

这篇具有很好参考价值的文章主要介绍了Chrome扩展程序是如何进行消息传递的。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

大家好,我是 dom 哥。这是我关于 Chrome 扩展开发的系列文章,感兴趣的可以 点个小星星。

一个复杂的 Chrome 扩展程序通常由 content_scriptsbackgroundaction popupside paneloptions pagedevtools 等部分组成,这些部分所负责的功能各不相同,所处的运行环境各不相同,所能访问的 chrome.* API 也各不相同,也因此经常需要通信告诉对方需要做什么。

下面是我画的一张图,简单说明各部分关系:

Chrome扩展程序是如何进行消息传递的

这些花花绿绿的部分各自运行在不同的环境中,往往需要相互通信,Chrome 为我们提供了两种通信方式:

  • 一种是一次性请求(one-time requests),一次只能发一条消息,类似于手机发短信,跟 HTTP 请求很像。
  • 一种是长期连接(long-lived connections),允许发送多条消息,类似于手机打电话,跟 Websocket 连接很像。

接下来就详细说说这两种通信方式。

一次性请求(one-time requests)

如果要向扩展程序的另一部分发送一条消息,有两个 API 可供调用:

  • chrome.runtime.sendMessage(extensionId?, message)
  • chrome.tabs.sendMessage(tabId, message)

从函数签名很容易看出来,一个是向扩展程序的各个部分发消息的,另一个是给某个浏览器的某个页签发消息的。

为什么设计两个 API?这是因为 content_scripts 是一个很独特的存在!

先说说浏览器的的工作原理。

浏览器的每个页签都是单独的线程。每个页签运行在与其他页签或扩展相隔离的独立线程中。如下图所示

Chrome扩展程序是如何进行消息传递的

我们在每个页签中打开页面。content_scripts 是一个很特殊的存在!作为被注入到页面的脚本,它的生命周期跟随页面。而扩展程序的其他部分,都有自己的生命周期!如果你在各个部分查看它们的 location,就会发现,只有 content_scripts 的 origin 是页面的 url 一样,而其它部分的 location.origin 都是 chrome://your-extention-id

知道了 content_scripts 的特殊性后,那么这两个 API 就很好理解了。

chrome.runtime.sendMessage() 是给扩展程序发消息的,它的第一个参数是一个可选的 extensionId,意味着不但可以给自身扩展程序发消息,还能给别的扩展程序发消息,它发送的消息可以被扩展的任一部分接收到,包括 backgroundaction popupside paneloptions pagedevtools 等等,除了 content_scripts!!!

那么想给 content_scripts 发送消息怎么办呢???

chrome.tabs.sendMessage() 就是专门用来给 content_scripts 发消息的!值得注意的是,想要给 content_scripts 发消息需要指定 tabId,也就是需要指明给哪个页签下的页面的 content_scripts 发消息。这个设计很好,因为每个页签的页面都运行了一份 content_scripts,这就避免了无关的页面接收到消息。

发送消息搞定啦,有方法发送就得有方法接收才行啊。

接收消息的方法只有一个 API:

chrome.runtime.onMessage.addListener(
  (message, sender, sendResponse) => boolean | undefined
)

在扩展程序的任意部分(包括 content_scripts)都是用这个接收消息。这很方便。

长期连接(long-lived connections)

长期链接的 API 和一次性消息的 API 是相互对应的。

要创建一个可重复使用的长期消息传递通道,有两个 API 可以调用:

  • chrome.runtime.connect(extensionId?, connectInfo?): Port
  • chrome.tabs.connect(tabId, connectInfo?): Port

这两个 API 的设计和一次性消息的一样。

chrome.runtime.connect() 用于和扩展程序的任一部分建立消息通道,除了 content_scripts!!!

chrome.tabs.connect() 是专门用来和 content_scripts 建立消息通道哒!

chrome.{runtime,tabs}.connect() 返回的是一个 Port 对象。Port 就是被设计用来在扩展程序的不同部分之间进行双向通信的一个接口。

觉得不错可以 点个小星星 支持一下哦 🌹文章来源地址https://www.toymoban.com/news/detail-760571.html

到了这里,关于Chrome扩展程序是如何进行消息传递的的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • #Chrome扩展程序开发教程--02:Hello Extensions

            本系列博客旨在带来最新的Chrome扩展程序开发入门教程。         本节博客中,笔者将带领读者创建一个最简单的扩展程序:                          1.创建一个文件夹,并在里面创建一个名为 manifest.json 的文件,输入以下内容: 这里面的 “act

    2023年04月22日
    浏览(29)
  • google Chrome通过 扩展程序获取windows MAC地址

    介绍 chrome 获取mac地址插件 软件架构 参考chrome插件开发规范 安装教程 将插件根目录拷贝到任意磁盘目录,一旦选定切勿搬移,目录名不包含空格。 修改manifest.json 中matches属性为要启用的网站域名 安装chrome浏览器,打开浏览器 = 更多工具 = 扩展程序 = 开发者模式 = 加载已解

    2024年02月06日
    浏览(50)
  • 【chrome扩展开发】如何在项目中判断插件是否已安装

    由于安全限制,本文采取间接的方式实现 比如通过cookie、localStorage等进行状态存储 在 background.js 中进行安装、卸载事件监听 Ps: management 权限的监听事件,似乎无法对安装、卸载起到作用,具体原因不清楚,还有待研究。 有兴趣的小伙伴也可以研究研究,官方文档地址:

    2024年02月11日
    浏览(28)
  • python是如何进行参数传递的?

    在分析python的参数传递是如何进行的之前,我们需要先来了解一下,python变量和赋值的基本原理,这样有助于我们更好的理解参数传递。 python变量以及赋值 数值 从几行代码开始 我们先将1赋值给a,也就是a指向了1这个对象, 在python中一切皆对象 。接着b=a,则表示让b也指向

    2024年02月14日
    浏览(37)
  • chorme安装esay scholar及chrome 无法从该网站添加应用、扩展程序和用户脚本解决方案

    如题,博主想安装easy scholar用于查询论文的分区,结果安装了半天一直出现chrome 无法从该网站添加应用、扩展程序和用户脚本解决方案的问题。 先从这个网址下载:https://www.easyscholar.cc/download 然后对下载好的文件进行解压。  按照[1]中说的,点击右上角三个点-更多工具-扩展

    2024年02月07日
    浏览(27)
  • 【Vue/Js】如何解决谷歌浏览器(chrome)扩展插件安装后,再打开自动消失问题(两种解决方案)

    卸载后,再重新从官网下载最新版安装。 注意:卸载一定要把缓存数据都卸载干净。 1、打开设置  2、选择百度或360 极简插件_Chrome扩展插件商店_优质crx应用 极简插件是一个优质Chrome插件扩展收录下载网站,收录热门好用的Chrome插件扩展,国内最方便的插件下载网站。 htt

    2024年02月05日
    浏览(44)
  • 如何使用postman进行参数传递以及csv数据驱动

    - 了解postman工具可以用来做什么 postman可以用来做接口测试,主要可以用来实现以下几个需求 可以快速构建我们想要发出的请求 可以保存我们已经做过的接口测试用例 可以提供响应数据比较的作用 可以把测试用例放到测试集里面去批量的执行,指定我们执行的次数,进行数

    2023年04月11日
    浏览(43)
  • 1.2.1 Qt中事件是如何进行传递——实例篇(下)

    1.2.1 Qt中事件是如何进行传递 1.2.2 Qt中的事件过滤器(eventFilter) 1.2.3 如何自己模拟发送事件消息 上一篇中我们讲解了Qt中的事件,通过流程图给大家展示了事件的传递过程,今天就通过代码来给大家实操一下,验证流程图的走向。 EventTestWgt.h EventTestWgt.cpp 图一:事件传递流

    2024年02月13日
    浏览(33)
  • SpringCloud微服务之间如何进行用户信息传递(涉及:Gateway、OpenFeign组件)

    在业务微服务中通过工具类获取当前用户信息 网关微服务(Gateway)往业务微服务传递用户信息 业务微服务之间通过OpenFeign传递用户信息 只要把上面两处打通,然后业务微服务在通过拦截器获取到用户信息,之后再将用户信息存在ThreadLocal中,这样我们就可以实现在业务微服

    2024年02月13日
    浏览(39)
  • 微信小程序一对多个页面间传递数据进行通信,事件触发的实现方法

    在有些场景下,使用组件间通信或者组件和页面间通信并不可行。比如我需要只有一个websocket实例,并且需要向多个页面传递我接收到的消息。 下面的方法是一个页面向其它页面(触发事件)传递数据,其它页面也可以向这个页面传递数据。也就是可以互相传递。 缺点是,

    2024年02月07日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包