扩展程序 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.message
和 chrome.runtime.onMessage
)。
除非您有使用 Service Worker 消息传递的特殊原因,否则您应该首选扩展程序消息传递。