Google chrome extension 如何使用manifestv3在chrome扩展中定期进行后台工作

Google chrome extension 如何使用manifestv3在chrome扩展中定期进行后台工作,google-chrome-extension,service-worker,manifest,Google Chrome Extension,Service Worker,Manifest,在manifest v3中,background.js机制已被删除,我正在寻找在它消失后如何在后台执行定期操作 本升级指南说明使用chrome alarm api: 具体来说,它说: 相反,我们可以使用Alarms API。与其他侦听器一样,报警侦听器应该在脚本的顶层注册 现在还不清楚它需要是哪个脚本的顶层,但当使用我的chrome扩展的入口点“popup.js”时,它会定期执行,但只有当chrome弹出窗口实际打开时才会执行。我需要它在后台执行,即使弹出窗口关闭。另一个需要注意的是,我没有定

在manifest v3中,background.js机制已被删除,我正在寻找在它消失后如何在后台执行定期操作

本升级指南说明使用chrome alarm api:

具体来说,它说:

相反,我们可以使用Alarms API。与其他侦听器一样,报警侦听器应该在脚本的顶层注册

现在还不清楚它需要是哪个脚本的顶层,但当使用我的chrome扩展的入口点“popup.js”时,它会定期执行,但只有当chrome弹出窗口实际打开时才会执行。我需要它在后台执行,即使弹出窗口关闭。另一个需要注意的是,我没有定义chrome.alarms,直到我在清单文件中的权限中添加“alarms”,然后它才停止运行,但我仍然有它不在后台运行的问题

因为上面的文章是在服务工作者的上下文中,所以我假设您需要将报警侦听器放在service-worker.js文件的顶层。只是这不起作用。我在这里未定义chrome.alarms(即使授予“alarms”权限):

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
            });
        }
    });
});
出于绝望,我也在清单中添加了“背景”权限,但这也没用


有没有关于如何在manifest v3的后台定期运行某些东西的线索?看起来alarms api应该是如何实现的,但服务人员显然无法访问它?

迁移指南非常混乱,因为它是由web开发人员编写的。它没有说明的是,使用扩展的服务工作者与ManifestV2事件页面减去DOM相关的API的99%相同,而DOM相关的API在工作者中不可用。因此,您需要进行的更改与切换到基本相同

因为上面的文章是在一个服务工作者的上下文中

这与您在manifest.json的
background
部分声明的后台服务人员脚本相同

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

除了创建报警外,您还需要添加一个侦听器,在后台脚本中出现报警时将调用该侦听器。“顶层”旨在简化“事件侦听器应该在每次后台脚本唤醒时执行时在事件循环的第一个任务中注册”。因此,您可以将它放在任何您想要的地方,例如,在其他函数中,甚至在同一个第一个任务中解析的承诺中。有关更多信息,请参阅

浏览器会记住报警,因此如果需要定期报警,则在安装扩展时只需创建一次。当前,您可以在每次服务人员醒来时重新创建警报,从而重置其计时。幸好您指定了一个id参数,否则每次都会添加一个新的报警

正在获取未定义的chrome.alarms

要使用大部分
chrome
API,您需要将其名称添加到manifest.json中的
权限。请注意,您需要在
chrome://extensions
编辑清单或后台脚本后的页面

  • manifest.json:

    “清单”版本:3,
    “背景”:{“服务工人”:“bg.js”},
    “权限”:[“报警”],
    
  • bg.js:

    chrome.alarms.onAlarm.addListener(a=>{
    console.log('Alarm!Alarm!',a);
    });
    chrome.runtime.onInstalled.addListener(()=>{
    chrome.alarms.get('alarm',a=>{
    如果(!a){
    create('alarm',{periodInMinutes:1});
    }
    });
    });
    
self.addEventListener('install'),
是不必要的,因为在安装扩展时,扩展的服务工作程序已在内部注册。MV3不需要任何服务工作程序生命周期事件,而且大多数/全部都不起作用