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 消息传递的特殊原因,否则您应该首选扩展程序消息传递