扩展 Service Worker 生命周期

扩展程序服务工作器会响应标准服务工作器事件以及扩展程序命名空间中的事件。之所以将这两种类型放在一起,是因为在使用扩展程序时,这两种类型通常会交替出现。

安装

当用户从 Chrome 应用商店安装或更新服务工件,或者使用 chrome://extensions 页面加载或更新已解压缩的扩展程序时,系统就会进行安装。系统会按以下顺序触发三项事件。

ServiceWorkerRegistration.install

安装期间触发的第一个事件是 Web Service Worker 的 install 事件。

chrome.runtime.onInstalled

接下来是扩展程序的 onInstalled 事件,在首次安装扩展程序(不是 Service Worker)、扩展程序更新到新版本以及 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 Service Worker 设计,用于从端点检索数据。您可以通过多种方式使用此 API,具体取决于用户是否需要看到最新数据以及需要到什么程度。如需了解详情,请参阅离线食谱。除非您要通过提取处理程序专门代理网络请求,否则应使用 chrome.storage

选择 Chrome 最低版本

自 Manifest V3 发布以来,我们对 Service Worker 的生命周期进行了多项改进。这意味着,如果您的 Manifest V3 扩展程序支持较低版本的 Chrome,您需要注意一些条件。如果上述情况不会影响您的扩展程序,您可以跳过此部分。如果是,不妨考虑在清单中指定最低 Chrome 版本

Chrome 120

现在可以将闹钟的最短时间段设置为 30 秒,以匹配 Service Worker 的生命周期。如需了解详情,请参阅 chrome.alarms

Chrome 118

现在,使用 chrome.debugger API 创建的活跃调试程序会话使 Service Worker 保持活动状态。这可防止服务工件在调用此 API 期间超时。

Chrome 116

Chrome 116 引入了以下 Service Worker 生命周期改进:

Chrome 114

使用长效消息传递发送消息可使服务工作器保持活跃状态。之前,打开端口会重置计时器,但发送消息不会。打开端口不会再重置计时器。

Chrome 110

扩展程序 API 调用会重置计时器。在此之前,只有运行事件处理脚本才能让服务工作器保持活跃状态。任何已加入队列但尚未调用处理脚本的事件都不会导致重置。

Chrome 109

通过屏幕外文档发送的邮件会重置计时器。

Chrome 105

使用 chrome.runtime.connectNative() 连接到原生消息传递主机可让服务工作器保持活跃状态。如果主机进程崩溃或关闭,端口将关闭,Service Worker 将在计时器完成后终止。为防止这种情况,请在充电桩的 onDisconnect 事件处理脚本中调用 chrome.runtime.connectNative()