如何在使用manifest v3的Chrome扩展程序中执行定期后台工作

3
manifest v3中已经移除了background.js机制,我正在寻找如何在后台执行周期性操作。
这个升级指南建议使用Chrome Alarm API:https://developer.chrome.com/docs/extensions/mv3/migrating_to_service_workers/ 具体来说,它说:
"我们可以使用Alarm API代替。像其他监听器一样,Alarm监听器应该在你脚本的顶层注册。"
不清楚需要在哪个脚本的顶层注册,但是当使用我的chrome扩展程序入口点 "popup.js" 时,它确实会定期执行,但仅在chrome弹出窗口实际打开时才执行。我需要即使当弹出窗口关闭时也能在后台执行。一个副作用是,我得到chrome.alarms的undefined,直到我在清单文件中添加 "alarms" 权限,然后它就不会出错了,但我仍然无法在后台运行。
由于上述文章是在服务工作者的环境下,所以我认为你需要将Alarm监听器放在service-worker.js文件的顶层。但事实并非如此,即使授予"alarms"权限,我在这里仍然得到chrome.alarms的undefined:
service-worker.js
console.log("inside service worker")

// getting chrome.alarms undefined here
chrome.alarms.create("alarm", { periodInMinutes: 1 });

将其放入安装事件监听器中也无济于事:

self.addEventListener('install', event => {
    console.log("Installing service worker")
    // still getting chrome.alarms undefined here
    chrome.alarms.create("alarm", { periodInMinutes: 1 });
    chrome.alarms.onAlarm.addListener((alarm) => {
        if (alarm.name === "alarm") {
            let milliseconds = new Date().getTime();
            console.log(milliseconds)
            chrome.action.setTitle({
                title: "Hello "+ milliseconds
            });
        }
    });
});

出于绝望,我也在清单文件中添加了“background”权限,但这也没有帮助。

有什么线索可以让我在清单v3中定期后台运行某些内容吗?看起来闹钟API应该是实现的方式,但显然从服务工作者中无法访问它?


我在一个为了测试而创建的增量计数器中遇到了类似的问题。然而,在我的情况下,我了解到它没有工作是因为浏览器每6秒重启一次服务工作线程脚本。请仔细查看这个问题,特别是我使用@wOxxOm的建议和存储计数器值来解决问题时的这条消息:github.com/GoogleChrome/chrome-extensions-samples/issues/630 - silvioprog
1个回答

9
迁移指南非常令人困惑,因为它是由一位网页开发者编写的。它没有说到使用扩展的服务工作者几乎与ManifestV2事件页面相同,除了在工作者中不可用的DOM相关API。因此,您需要进行的更改基本上与切换到ManifestV2中的event pages相同。

由于上述文章是在服务工作者的上下文中

这只是您在manifest.json文件的background部分声明的相同后台服务工作者脚本。

警报侦听器应在脚本的顶层注册。

除了创建一个闹钟,您需要添加一个监听器,在背景脚本中触发"alarm event"时会调用该监听器。 "top level"的意图是让"事件监听器应在每次背景脚本执行且唤醒时的第一个任务中注册"更加简单易懂。因此,您可以将其放置在任何位置,例如其他函数内部甚至在解析同一第一个任务的Promise内部。有关更多信息,请参见JavaScript事件循环
浏览器会记住闹钟,因此如果您需要定期的闹钟,则应在安装扩展程序时仅创建一次。当前,您每次服务工作者唤醒时都会重新创建闹钟,这会重置其时间。幸好您指定了一个id参数,否则每次都会添加一个新的闹钟。

这里获取chrome.alarms未定义

要使用大多数chrome API,您需要将其名称添加到manifest.json中的permissions。请注意,在编辑清单或后台脚本后,您需要在chrome://extensions页面上单击扩展卡上的重新加载按钮。

  • manifest.json:

    "manifest_version": 3,
    "background": { "service_worker": "bg.js" },
    "permissions": [ "alarms" ],
    
  • bg.js:

    chrome.alarms.onAlarm.addListener(a => {
      console.log('Alarm! Alarm!', a);
    });
    
    chrome.runtime.onInstalled.addListener(() => {
      chrome.alarms.get('alarm', a => {
        if (!a) {
          chrome.alarms.create('alarm', {periodInMinutes: 1});
        }
      });
    });
    

self.addEventListener('install',并不是必需的,因为扩展程序的服务工作者在安装扩展程序时会自动注册。对于MV3来说,服务工作者的生命周期事件都不是必需的,大多数甚至无法正常工作。


如果您需要每秒执行后台工作,该怎么办? - foba
@foba,请查看Chrome扩展中的持久化Service Worker - wOxxOm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接