Service Worker 中的事件

扩展程序服务工支持标准服务工事件以及扩展程序 API 中的许多事件。本部分介绍了可用的功能,并提供了使用这些功能的提示。

声明扩展程序事件

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

不推荐
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 });
});

常见事件

扩展程序服务工支持特定 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 事件

扩展程序服务工作器支持的生命周期事件不仅仅是其他部分中所述的事件。

ServiceWorkerGlobal.fetch

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

ServiceWorkerGlobal.message

除了扩展程序消息传递外,Service Worker 消息传递功能可用,但这两个系统无法互操作。这意味着,使用 sendMessage()(可通过多个扩展程序 API 获取)发送的消息不会被服务工件消息处理脚本拦截。同样,扩展程序消息处理脚本不会拦截使用 postMessage() 发送的消息。扩展程序 Service Worker 同时支持这两种消息处理程序(即 ServiceWorkerGlobal.messagechrome.runtime.onMessage)。

除非您有特殊原因要使用服务工件消息传递,否则应优先使用扩展程序消息传递