对于那些不熟悉 Web 扩展开发世界的人来说,Chrome 正在酝酿一场风暴。 Google 将停止对清单版本 2 的支持,这是绝大多数网络扩展所使用的。 Manifest 版本 3 有很多变化,但最大的变化是从持久性后台脚本转移到服务工作者。这……是……一个……巨大的……变化。
从清单版本 2 到版本 3 的更改包括:
- 从持久的后台脚本到可能在 5 分钟后死亡的服务工作者
- 不使用服务工作者的
<iframe>
元素或其他 DOM API - 所有的 API 都变成了基于 Promise 的
- 从 CSP 角度对内容的限制
Web 扩展经常使用的一个功能是在每个新页面加载时执行脚本。对于像 MetaMask 这样的网络扩展,我们需要提供一个全局的window.ethereum
供 dApp 使用。那么我们如何使用清单版本 3 做到这一点呢?
从 Chrome v102 开始,开发人员可以为内容脚本定义一个值为isolated
或main
(在页面中)的world
属性。虽然开发人员应该在扩展的manifest.json
文件中定义content_scripts
,但main
值仅在您以编程方式从 service worker 定义时才有效(由于 Chrome 错误):
等待 chrome.scripting.registerContentScripts([ { id: '页面内', 匹配:['http://*/*', 'https://*/*'], js: ['in-page.js'], runAt:'document_start', 世界:'主要', }, ]);
在上面的示例中,每次加载新页面时, in-page.js
都会在主内容选项卡中注入并执行。这个in-page.js
文件设置window.ethereum
供所有 dApp 使用。如果world
undefined
或isolated
,脚本仍会执行,但会在孤立的环境中执行。
Manifest 版本 3 的工作相当艰巨,因此请拥抱您最亲密的扩展开发人员。有许多巨大的结构变化,驾驭这些变化是一种残酷的推动!
How to Inject a Global with Web Extensions in Manifest V3的帖子首先出现在David Walsh 博客上。