Service Worker 中的事件

扩展程序服务工作线程支持标准服务工作线程事件和扩展程序 API 中的许多事件。本部分将介绍可用的功能,并提供有关如何使用这些功能的提示。

声明扩展程序事件

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

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

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

常见事件

扩展程序服务工作线程支持特定 API 中的事件。下面介绍几种常见的方法。请注意,其中一些 API 需要权限才能使用,而另一些 API 的事件、方法或属性可能无法在所有版本的 Chrome 中使用。如需了解详情,请参阅关联的 API 文档,尤其是您要使用的事件、方法或属性。

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

过滤条件

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

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

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

Service Worker 事件

扩展程序服务工作线程支持的生命周期事件不仅仅是其他位置所述的那些。

ServiceWorkerGlobal.fetch

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

ServiceWorkerGlobal.message

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

除非有特殊原因,否则您应优先使用扩展程序消息传递,而不是 Service Worker 消息传递。