【问题标题】:How do I call a function periodically in a manifest v3 Chrome extension?如何在清单 v3 Chrome 扩展程序中定期调用函数?
【发布时间】:2021-05-29 03:23:20
【问题描述】:

Service workers replace background pages in manifest v3 chrome extensions,我正在尝试将一个用于我的扩展。我需要能够定期运行一个函数,并且it looks like alarms are the way to go。在示例中,他们建议在服务人员的顶层执行此操作:

chrome.alarms.create({ delayInMinutes: 3.0 });

chrome.alarms.onAlarm.addListener(() => {
  chrome.action.setIcon({
    path: getRandomIconPath(),
  });
});

但据我了解,我的服务人员是否在事件之间被杀死是不确定的。我相信如果浏览器杀死我的服务工作者,这将每 3 分钟调用一次,因为当脚本重新启动以处理警报时,它将再次运行第一行并排队另一个警报。

相比之下,如果浏览器让我的服务人员在警报之间存活 3 分钟,这不会循环,因为它只会调用一次 addListener(),但会调用两次回调(一次用于第一个警报最初产生了这个服务工作人员,并再次为在服务工作人员调用的第一行注册的警报)。 Service Worker 最终将死去,再也没有警报将其唤醒。

我是否误解了事件在这里的运作方式?如果没有,我如何注册一次再次发生的警报chrome.alarms.create({ periodInMinutes: 3.0 }); 并避免每次重新启动我的 service worker 时都重新注册?

注意:delayInMinutes 触发一次,periodInMinutes 重新出现。

【问题讨论】:

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


    【解决方案1】:

    虽然它是非确定性的,但规则非常简单,worker 的行为几乎与 ManifestV2 的旧事件页面一模一样,主要是:

    • 它会在注册的 API 事件发生时唤醒
    • 它运行整个脚本,以便重新注册 API 侦听器
    • 它为唤醒它的 API 事件运行侦听器
    • 在最后一个 API 事件后 30 秒(MV2 中为 15)后卸载;如果触发了另一个 API 事件,则重新启动卸载计时器;如果有用于 chrome.runtime 消息传递的开放端口,则计时器将延长五分钟,在 MV3 中,消息传递端口在五分钟后被强制断开,而在 MV2 中,这些端口从不强制断开连接,从而使 MV2 事件页面保持活动状态。

    现在回到那个演示脚本。你是对的:它依赖于非确定性行为。就像扩展文档中的许多示例一样,这很糟糕。使用 API 参考和 devtools 调试器。

    一个更现实的例子是只注册一次警报,例如在 chrome.runtime.onInstalled 事件中,因为警报是由浏览器内部记住的。另外,最好给它一个 id 以便我们检查它的存在:

    chrome.runtime.onInstalled.addListener(() => {
      chrome.alarms.get('periodic', a => {
        if (!a) chrome.alarms.create('periodic', { periodInMinutes: 3.0 });
      });
    });
    
    chrome.alarms.onAlarm.addListener(() => {
      chrome.action.setIcon({
        path: getRandomIconPath(),
      });
    });
    

    【讨论】:

    • 从 contentscript 向 serviceworker 发送消息不会唤醒 serviceworker。这是预期的吗?
    • 它肯定会唤醒工人,所以我想你应该在 crbug.com 上报告它,但你必须提供更多信息和演示扩展,因为它们很可能无法重现问题,因为我也做不到。
    猜你喜欢
    • 1970-01-01
    • 2021-06-12
    • 2021-09-20
    • 2022-11-15
    • 2018-03-09
    • 2021-09-30
    • 2021-03-26
    • 2021-09-21
    • 1970-01-01
    相关资源
    最近更新 更多