gpt4 book ai didi

google-chrome-extension - 您如何使用 list v3 在 chrome 扩展中进行定期后台工作

转载 作者:行者123 更新时间:2023-12-05 00:44:35 25 4
gpt4 key购买 nike

在 manifest v3 中删除了 background.js 机制,现在我正在寻找如何在后台执行定期操作。

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

具体来说:

Instead, we can use the Alarms API. Like other listeners, alarm listeners should be registered in the top level of your script.

目前尚不清楚它需要成为顶层的哪个脚本,但是当使用我的 chrome 扩展程序的入口点“popup.js”时,它会定期执行,但只有在 chrome 弹出窗口实际打开时才会执行。即使弹出窗口关闭,我也需要它在后台执行。附带说明一下,在我将“警报”添加到 list 文件中的权限之前,我没有为 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
});
}
});
});

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

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

最佳答案

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

Since the above article is in the context of a service worker

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

alarm listeners should be registered in the top level of your script.

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

浏览器会记住警报,因此如果您需要定期警报,您应该在安装扩展程序时只创建一次。目前,您每次服务工作人员醒来时都会重新创建警报,这会重置其时间。好在你指定了一个 id 参数,否则每次都会添加一个新的警报。

getting chrome.alarms undefined here

要使用大部分 chrome API,您需要将其名称添加到 manifest.json 中的 permissions。请注意,编辑 list 或后台脚本后,您需要在 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', 不是必需的,因为扩展的服务 worker 在安装扩展时在内部注册。MV3 和大多数/全部都不需要服务 worker 生命周期事件甚至不会工作。

关于google-chrome-extension - 您如何使用 list v3 在 chrome 扩展中进行定期后台工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66629892/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com