扩展程序服务工作器会响应标准服务工作器事件以及扩展程序命名空间中的事件。之所以将这两种类型放在一起,是因为在使用扩展程序时,这两种类型通常会交替出现。
安装
当用户从 Chrome 应用商店安装或更新服务工件,或者使用 chrome://extensions
页面加载或更新已解压缩的扩展程序时,系统就会进行安装。系统会按以下顺序触发三项事件。
ServiceWorkerRegistration.install
安装期间触发的第一个事件是 Web 服务工作线程的 install 事件。
chrome.runtime.onInstalled
接下来是扩展程序的 onInstalled
事件,该事件会在首次安装扩展程序(而非 ServiceWorker)、扩展程序更新到新版本以及 Chrome 更新到新版本时触发。您可以使用此事件来设置状态或进行一次性初始化,例如上下文菜单。
chrome.runtime.onInstalled.addListener((details) => {
if(details.reason !== "install" && details.reason !== "update") return;
chrome.contextMenus.create({
"id": "sampleContextMenu",
"title": "Sample Context Menu",
"contexts": ["selection"]
});
});
ServiceWorkerRegistration.active
最后,系统会触发服务工作器的 activate 事件。请注意,与 Web 服务 worker 不同,此事件会在安装扩展程序后立即触发,因为扩展程序中没有与页面重新加载相当的操作。
扩展程序启动
当用户个人资料启动时,系统会触发 chrome.runtime.onStartup
事件,但不会调用任何服务工作器事件。
空闲和关机
通常,当满足以下任一条件时,Chrome 会终止服务工件:
- 无操作 30 秒后。接收事件或调用扩展程序 API 会重置此计时器。
- 单个请求(例如事件或 API 调用)的处理时间超过 5 分钟。
fetch()
响应到达时间超过 30 秒。
事件和对扩展程序 API 的调用会重置这些计时器,如果服务工件已进入休眠状态,则传入事件会使其恢复活跃状态。不过,您应将服务工件设计为能够抵御意外终止。
为优化扩展程序的资源消耗,请尽可能避免让您的服务工件无限期保持活跃状态。请测试您的扩展程序,确保您没有无意中执行此操作。
持久保存数据,而不是使用全局变量
如果服务工件关闭,您设置的所有全局变量都将丢失。请改为将值保存到存储空间,而不是使用全局变量。您的选项如下所列。请注意,Web Storage API 不适用于扩展程序服务工作器。
- chrome.storage API
- 一个扩展程序 API,提供多种类型的存储空间:本地存储空间、会话存储空间、受管理的存储空间(网域)和同步存储空间。此 API 用于存储使用开发者定义的键标识和检索的 JSON 对象。当用户清除网络缓存时,此类存储空间不会被移除。
- IndexedDB API
- 一种低级 API,用于在客户端存储结构化数据(包括文件和 blob)。此 API 提供了用于创建事务性数据存储和检索的基本元素。虽然此 API 通常过于复杂,不适用于简单的用例,但许多第三方存储解决方案都是基于此 API 构建的。
- CacheStorage API
- 请求和响应对象对的永久性存储机制。此 API 专为 Web 服务 worker 而设计,用于从端点检索数据。您可以通过多种方式使用此 API,具体取决于用户是否需要看到最新数据以及需要到什么程度。如需了解详情,请参阅离线食谱。除非您要通过提取处理程序专门代理网络请求,否则应使用
chrome.storage
。
选择最低 Chrome 版本
自 Manifest V3 发布以来,我们对服务工件生命周期进行了多项改进。这意味着,如果您的 Manifest V3 扩展程序支持较低版本的 Chrome,您需要注意一些条件。如果这些条件不会影响您的扩展程序,您可以跳过本部分。如果是,不妨考虑在清单中指定最低 Chrome 版本。
Chrome 120
现在,闹钟最短间隔时间可设置为 30 秒,以匹配 Service Worker 生命周期。如需了解详情,请参阅 chrome.alarms
。
Chrome 118
使用 chrome.debugger
API 创建的有效调试程序会话现在会使服务工件保持活跃状态。这可防止服务工件在调用此 API 期间超时。
Chrome 116
Chrome 116 引入了以下 Service Worker 生命周期改进:
有效的
WebSocket
连接现在会延长扩展程序服务工作器的生命周期。在扩展程序服务工作器中通过WebSocket
发送或接收消息会重置服务工作器的空闲计时器。其他扩展程序 API 可以超出扩展程序服务工作器的五分钟超时期限。这些 API 会向用户显示提示,因此解决问题可能需要超过 5 分钟。其中包括
desktopCapture.chooseDesktopMedia()
、identity.launchWebAuthFlow()
、management.uninstall()
和permissions.request()
。
Chrome 114
使用长效消息传递发送消息可使服务工作器保持活跃状态。以前,打开端口会重置计时器,但发送消息不会。打开端口不再重置计时器。
Chrome 110
扩展程序 API 调用会重置计时器。在此之前,只有运行事件处理脚本才能使服务工作器保持活跃状态。任何已加入队列但尚未调用处理脚本的事件都不会导致重置。
Chrome 109
从屏幕外文档发送的消息会重置计时器。
Chrome 105
使用 chrome.runtime.connectNative()
连接到原生消息传递主机可让服务工作器保持活跃状态。如果主机进程崩溃或关闭,该端口将关闭,并且服务工件将在计时器完成后终止。为防止这种情况,请在充电桩的 onDisconnect 事件处理脚本中调用 chrome.runtime.connectNative()
。