微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

chrome.runtime.onInstalled.addListener 清单版本 3 从版本 2 迁移

如何解决chrome.runtime.onInstalled.addListener 清单版本 3 从版本 2 迁移

我有一个 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"
}],

有两个问题:

  1. 我相信我需要这个还是我需要?这样当扩展程序在 chrome 商店和浏览器中更新时,这会导致 Chrome - Gmail 重新加载并使用最新版本。如果我在这个假设中错了,请纠正我。如果我在开发者模式 (chrome://extensions) 下使用解压版本并使用刷新按钮将重新加载扩展程序和 Gmail。
  2. 我无法弄清楚 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 为我指明了正确的方向。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。