当前位置: 首页 > news >正文

第三部分 — 服务工作者(后台)chrome.runtime 是什么(在 MV3 的说法中)

chrome.runtime 是扩展内的“粘合剂” API:

  • 生命周期事件(安装/更新)

  • 身份 (runtime.id, getURL)

  • 轻量级消息入口点

  • 通过 chrome.runtime.lastError 的错误处理层(针对回调 API)

如果从 MV2 迁移过来:将 chrome.runtime 视作 稳定协调层, 位于 UI 页面、服务工作者、内容脚本之间(可选地) 与离屏文档之间。

7.2 runtime.id, getURL,以及环境假设

console.log("extension id:", chrome.runtime.id); console.log("options url:", chrome.runtime.getURL("options.html"));

注意事项:

  • 除非在企业部署流程中,否则不要硬编码扩展ID。

  • 对于内部资源,请使用 getURL()。 它可以适应打包差异。

7.3 实际使用的 onInstalled 细节

chrome.runtime.onInstalled.addListener((details) => { console.log("onInstalled:", details.reason, details.previousVersion); if (details.reason === "install") { // One-time setup: defaults, onboarding, etc. } if (details.reason === "update") { // Migration: version-based transforms. } });

设计规则: 数据迁移必须是幂等的,并且在需要时可以安全地重新运行。

7.4 消息入口点:onMessage(以及异步陷阱)

最小模式(异步响应):

chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => { (async () => { if (msg.type !== "PING") return; sendResponse({ ok: true, from: "sw" }); })().catch((err) => { sendResponse({ ok: false, error: String(err) }); }); // Critical in MV3: keep the channel open for async. return true; });

** Pitfalls:**

  • 忘记添加 return true → 间歇性“消息通道关闭”失败。

  • 不验证 sender → 多个上下文发送消息时的安全/逻辑漏洞。

7.5 始终验证 sender(最小安全检查)

function assertSender(sender) { // Example: only accept messages from your own extension pages. if (sender.id !== chrome.runtime.id) { throw new Error("Unexpected sender.id"); } } chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => { try { assertSender(sender); sendResponse({ ok: true }); } catch (e) { sendResponse({ ok: false, error: String(e) }); } });

7.6 回调错误:chrome.runtime.lastError(当适用时)

规则: 只在回调内部检查 lastError。

chrome.runtime.getPlatformInfo((info) => { if (chrome.runtime.lastError) { console.error(chrome.runtime.lastError.message); return; } console.log(info); });

陷阱: 在回调之外检查 lastError 没有意义。

7.7 connect vs sendMessage(决策点)

  • 使用 sendMessage 进行请求/响应操作。

  • 当你需要以下功能时使用 connect (端口):

  • 流式进度

  • 长期协调

  • 重连逻辑(特别是在 SW 重启时)

(端口在第四部分有深入介绍。)

最小示例

一个最小的 MV3 安全异步消息处理器(适合作为模板):

chrome.runtime.onMessage.addListener((msg, sender, sendResponse) => { (async () => { if (msg?.type !== "PING") return; sendResponse({ ok: true }); })().catch((err) => sendResponse({ ok: false, error: String(err) })); return true; // keep channel open for async });

常见陷阱

  • 依赖隐式的状态(全局变量)而不是持久化的存储

  • 假设 MV3 提供的时间/生命周期保证实际上并不提供

  • 过度请求权限/宿主访问

7.8 检查清单

  • [ ] 不要硬编码扩展 ID(除非企业版)

  • [ ] onInstalled 的迁移操作是幂等的

  • [ ] 所有异步 onMessage 处理函数都返回 true

  • [ ] 验证 sender 至少通过 sender.id

  • [ ] 对于回调 API:在回调中检查 runtime.lastError

7.9 参考

  • chrome.runtime(官方): chrome.runtime

  • 消息概览(官方): Message passing

http://www.jsqmd.com/news/454305/

相关文章:

  • matlab画图工具
  • 2005-2025年我国乡镇级的逐日最低气温数据(Shp/Excel格式)
  • 只禁止「显卡」驱动自动更新 不影响声卡、网卡、蓝牙、任何其他硬件
  • 【先到先得】夸克网盘免费领取1TB空间保姆级教程!新老用户均可!最新可用!
  • 林俊旸离职,AI 人才路在何方?
  • Python绘制相交平面
  • 2026生物医药行业纯水设备优质品牌推荐榜 - 优质品牌商家
  • 养护策略优化模型:从单设备到路网级的多维决策系统
  • openclaw 调用openai codex , python 调用
  • 如何利用熊猫智汇赋能数字员工突破业务壁垒?
  • ORA-29660错误找不到EXTERNAL NAME定义的类,远程处理故障修复思路分享
  • 吐血整理,性能测试总结汇总,多个视角分析性能压测,一篇通透...
  • 快手 C++ 面试题:如何突破封装访问私有成员?
  • 基于电解槽与甲烷反应器构建低碳综合能源系统优化策略:购能成本、碳排放与弃风成本最小化实践指导文献研究
  • 代码随想录算法营完结!
  • 全网最细,web端测试常见与最有意义的bug(总结)
  • Abaqus与Matlab联合应用:直齿轮、斜齿轮模型调试及裂纹磨损故障刚度分析,稳态瞬态温度场研究
  • 2026国家金融监督管理总局国考计算机岗·经济金融基础全解析:技术人必掌握的15大核心考点与实战题库(附2025央行最新政策+真题示例+答题策略)
  • 2026年3月江苏徐州室内装修/室内设计/全屋定制/精装局改/软装搭配公司竞争格局深度分析报告 - 2026年企业推荐榜
  • 《计算机组成原理》细致学:计算机的功能部件
  • RecyclerView 缓存与复用机制:从一次滑动讲明白(2026 版)
  • AI写论文法宝!这4款AI论文写作工具,实现论文快速原创生成!
  • SQL自学:怎么创建视图
  • 【信道估计】基于matlab大规模MIMO-OFDM系统的5G通信信道估计算法研究【含Matlab源码 15125期】含文献
  • 用H Builder X做一个简单HTML网页
  • 深度解析Apache Fesod 2.0:重新定义Java生态高性能Excel处理的天花板
  • 2026四川不锈钢水箱采购必看:钢联建环保18项专利与500台套产能解析 - 深度智识库
  • Maven 中 test 的真正含义:限制测试类专用 打包自动跳过测试
  • 深度解析:飞扬集成设计系统如何实现建筑工程全流程数字化?
  • 客路商品详情页前端性能优化实战