Service Worker 中的事件

扩展程序 Service Worker 同时支持标准 Service Worker 事件和扩展程序 API 中的许多事件。本部分介绍了有哪些可用功能,并提供了相关使用提示。

声明扩展程序事件

Service Worker 中的事件处理脚本需要在全局范围内声明,这意味着它们应该位于脚本的顶层,而不应嵌套在函数内。这样可以确保它们在脚本初始执行时同步注册,从而使 Chrome 能够在 Service Worker 启动后立即将事件分派给它。例如:

不推荐
chrome.storage.local.get(["badgeText"], ({ badgeText }) => {
  chrome.action.setBadgeText({ text: badgeText });
  chrome.action.onClicked.addListener(handleActionClick);
});

较好的做法
chrome.action.onClicked.addListener(handleActionClick);

chrome.storage.local.get(["badgeText"], ({ badgeText }) => {
  chrome.action.setBadgeText({ text: badgeText });
});

常见事件

扩展 Service Worker 支持特定 API 中的事件。下面介绍了几种常见的错误。请注意,其中一些 API 需要权限才能使用,而其他 API 可能具有并非在所有版本的 Chrome 中都提供的事件、方法或属性。如需了解详情,请参阅链接的 API 文档,尤其是您要使用的事件、方法或属性。

chrome.action
当有用户与扩展程序的工具栏图标互动时触发,无论该操作是针对特定网页(标签页)还是整个扩展程序。
chrome.management
提供与安装、卸载、启用和停用扩展程序相关的事件。
chrome.notifications
提供与用户与扩展程序生成的系统通知互动相关的事件。
chrome.permissions
指示用户��时授予或撤消扩展程序权限。
chrome.runtime
提供与扩展程序生命周期相关的事件、扩展程序的其他部分发送的消息,以及可用扩展程序或 Chrome 更新的通知。
chrome.storage.onChanged
每当任何 StorageArea 对象被清除或某个键的值被更改或设置时触发。请注意,每个 StorageArea 实例都有自己的 onChanged 事件。
chrome.webNavigation
提供有关飞行中导航请求状态的信息。

过滤条件

要将事件限制为特定用例,或消除不必要的事件调用,请使用支持事件过滤器的 API。例如,假设某个扩展程序会监听 tabs.onUpdated 事件,以检测用户何时导航到特定网站。系统会在每个标签页上的每次导航时调用此事件。请改为搭配使用 webNavigation.onCompleted 和过滤条件。例如:

const filter = {
  url: [
    {
      urlMatches: 'https://www.google.com/',
    },
  ],
};

chrome.webNavigation.onCompleted.addListener(() => {
  console.info("The user has loaded my favorite website!");
}, filter);

Web Service Worker 事件

Extension Service Worker 支持的生命周期事件不仅仅是在别处介绍的。

ServiceWorkerGlobal.fetch

从扩展程序软件包中检索任何内容时,或者从扩展程序或弹出式脚本调用 fetch()XMLHttpRequest() 时触发。(Service Worker fetch 处理程序拦截来自内容脚本的调用。)在后一种情况下,您需要将要提取的网页的网址添加到 manifest.json 中的 "host_permissions" 键中。

ServiceWorkerGlobal.message

除了扩展消息传递之外,您还可以使用 Service Worker 消息传递,但这两个系统无法互操作。这意味着,使用 sendMessage()(可通过多个扩展 API 使用)发送的消息不会被 Service Worker 消息处理程序拦截。同样,使用 postMessage() 发送的消息也不会被扩展程序消息处理程序拦截。扩展 Service Worker 支持两种类型的消息处理程序(即 ServiceWorkerGlobal.messagechrome.runtime.onMessage)。

除非您有使用 Service Worker 消息传递的特殊原因,否则您应该首选扩展程序消息传递