码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Chrome扩展程序是如何进行消息传递的


    合集 - Chrome扩展开发完全指南(8)
    1.Chrome扩展开发系列开篇2023-12-192.Chrome扩展的核心:manifest 文件(上)2023-12-133.Chrome扩展的核心:manifest 文件(中)2023-12-144.Chrome扩展的核心:manifest 文件(下)2023-12-165.Chrome扩展开发实战:快速填充表单2023-12-156.打造一个极度舒适的Chrome扩展项目开发环境 🚀2023-12-177.推荐给前端开发的 5 款 Chrome 扩展 🚀2023-12-18
    8.Chrome扩展程序是如何进行消息传递的2023-12-25
    收起

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

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

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

    这些花花绿绿的部分各自运行在不同的环境中,往往需要相互通信,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 是一个很独特的存在!

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

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

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

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

    chrome.runtime.sendMessage() 是给扩展程序发消息的,它的第一个参数是一个可选的 extensionId,意味着不但可以给自身扩展程序发消息,还能给别的扩展程序发消息,它发送的消息可以被扩展的任一部分接收到,包括 background,action popup,side panel,options page,devtools 等等,除了 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 就是被设计用来在扩展程序的不同部分之间进行双向通信的一个接口。

    觉得不错可以 点个小星星 支持一下哦 🌹

  • 相关阅读:
    wpf devexpress自定义编辑器
    实体机安装centos7问题总结
    SpringBoot集成SpringSecurity从0到1搭建权限管理详细过程(认证+授权)
    Gin 笔记(07)— 自定义中间件、全局中间件、组中间件、单请求中间件、BasicAuth 中间件、限流中间件、中间件内使用 goroutines
    golang的垃圾回收算法之十一Stack的处理
    网络安全与代理技术:解密 SOCKS5、代理IP 和 HTTP
    流媒体分析之rtmp 协议封装
    Win11C盘变红怎么办?Win11C盘变红的清理方法
    前端开发攻略---封装calendar日历组件,实现日期多选。可根据您的需求任意调整,可玩性强。
    Android绑定式服务
  • 原文地址:https://www.cnblogs.com/iovec/p/messaging.html
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号