【问题标题】:How do you do periodic background work in a chrome extension using manifest v3您如何使用清单 v3 在 chrome 扩展中进行定期后台工作
【发布时间】:2021-06-12 05:47:37
【问题描述】:

在 manifest v3 中删除了 background.js 机制,现在我正在寻找如何在后台进行定期操作,因为它已经消失了。

本升级指南说要使用 chrome alarm api: https://developer.chrome.com/docs/extensions/mv3/migrating_to_service_workers/

具体来说:

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

不清楚它需要成为顶层的哪个脚本,但是当使用我的 chrome 扩展程序的入口点“popup.js”时,它会定期执行,但只有在 chrome 弹出窗口实际打开时才会执行。即使弹出窗口关闭,我也需要它在后台执行。附带说明一下,在我将“警报”添加到清单文件中的权限之前,我没有为 chrome.alarms 定义,然后它不会阻塞,但我仍然遇到它没有运行后台的问题。

由于上面的文章是在 service worker 的上下文中,我假设您需要将警报侦听器放在 service-worker.js 文件的顶层。只有这行不通。我在这里未定义 chrome.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
            });
        }
    });
});

出于绝望,我也在清单中添加了“背景”权限,但这也无济于事。

任何线索如何在清单 v3 的后台定期运行某些东西?似乎警报 api 应该是您的操作方式,但服务人员显然无法访问它?

【问题讨论】:

  • 我在为测试而制作的增量计数器中遇到了类似的问题。但是,就我而言,我被引导理解它不起作用,因为浏览器似乎每 6 秒重新启动一次服务工作者脚本。当我使用@wOxxOm 的建议修复问题并存储计数器值时,请查看此问题,尤其是此消息:github.com/GoogleChrome/chrome-extensions-samples/issues/630

标签: google-chrome-extension service-worker manifest


【解决方案1】:

迁移指南非常令人困惑,因为它是由 Web 开发人员编写的。它没有说的是,使用扩展的 service worker 与 ManifestV2 事件页面减去 DOM 相关 API 的 99% 相同,后者在 worker 中不可用。所以你需要做的改变与切换到event pages in ManifestV2基本相同。

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

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

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

除了创建警报之外,您还需要添加一个侦听器,当您的后台脚本中的alarm event fires 时将调用该侦听器。 “顶层”旨在简化真正的“事件侦听器应在每次后台脚本唤醒时执行时在事件循环的第一个任务中注册”。所以你可以把它放在任何你想要的地方,例如在其他函数中,甚至在同一个任务中解决的 Promise 中。欲了解更多信息,请参阅JavaScript event loop

浏览器会记住警报,因此如果您需要定期警报,您应该在安装扩展程序时只创建一次。目前,您每次服务工作人员醒来时都会重新创建警报,这会重置其时间。好在你指定了一个 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 不需要任何 Service Worker 生命周期事件,而且大多数/全部甚至都不起作用。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-05-29
  • 2022-07-26
  • 2022-08-15
  • 1970-01-01
  • 1970-01-01
  • 2022-11-15
  • 2021-09-30
  • 1970-01-01
相关资源
最近更新 更多