问题描述
我有一个 2 年旧的 Gmail chrome 扩展,我正在更新到版本 3。 我使用 iframe 将 JSON 数据传输到/从我的服务器传输,这在使用版本 2 或 3 时效果很好。
我遇到的问题是 background.js(适用于版本 2)
//background.js reloads gmail when extension installed or refreshed
chrome.runtime.onInstalled.addListener(function(){
chrome.tabs.query({url: "https://mail.google.com/*"},function(tab) {
if ( typeof tab[0].url != 'undefined' && tab[0].url.indexOf('https://mail.google.com') == 0 ) {
chrome.tabs.reload(tab[0].id);
}
});
});
在清单 V2 中,它是这样声明的:
"background": {
"scripts": ["background.js"],"persistent": false //true
},
在 manifest V3 中,我们现在必须使用 Service Worker:
"background": [{
"service_worker": "background.js"
}],
有两个问题:
- 我相信我需要这个还是我需要?这样当扩展程序在 chrome 商店和浏览器中更新时,这会导致 Chrome - Gmail 重新加载并使用最新版本。如果我在这个假设中错了,请纠正我。如果我在开发者模式 (chrome://extensions) 下使用解压版本并使用刷新按钮将重新加载扩展程序和 Gmail。
- 我无法弄清楚 Service Worker 将如何工作,因为它们本质上不是持久的,而且这个“监听器”需要一直在监听。 有人有将 service worker/background.js 从第 2 版迁移到第 3 版的示例吗?
更多信息:Migrating from background pages to service workers
谢谢。
解决方法
听起来您是这篇写得不好的文档文章的受害者:作者是一名网络开发人员,他似乎认为有必要强调 Service Worker 是不同的和更好的东西,而它在概念上与 {{ 3}}(又名“非持久性后台脚本”),我们过去几年一直在使用。
由于您已经在使用事件页面,您可以简单地继续做您一直在做的事情:注册 API 事件处理程序,例如 chrome.runtime.onInstalled 或 chrome.tabs.onUpdated,以便 Chrome 在内部记住这些注册。当工作程序在 30 秒不活动后终止时,如果您订阅的事件发生,Chrome 将启动工作程序,整个脚本将再次运行,然后您的侦听器将被调用。重申一下,这与事件页面的工作方式完全相同。
附言您的 Service Worker 代码错误地添加了 [
和 ]
。这是正确的代码:
"background": {
"service_worker": "background.js"
},
,
在下面: chrome.tabs.query({url: "https://mail.google.com/*"},function(tab) {
“tabs”未定义,所以我添加了
"permissions": ["tabs"],
到清单,一切正常!奇怪的是使用版本 2 我不需要这个权限。
也感谢@wOxxOm 为我指明了正确的方向。