扩展 Service Worker 生命周期

扩展程序服务工作器会响应标准服务工作器事件和扩展程序命名空间中的事件。之所以将它们放在一起介绍,是因为在扩展程序的使用过程中,一种类型通常会紧随另一种类型。

安装

当用户从 Chrome 应用商店安装或更新服务工作线程时,或者当用户使用 chrome://extensions 页面加载或更新未打包的扩展程序时,系统会进行安装。依次发生以下三个事件:

  1. install
  2. onInstall
  3. activate

ServiceWorkerRegistration.install

安装期间触发的第一个事件是 Web 服务工作线程的 install 事件。

chrome.runtime.onInstalled

接下来是扩展程序的 onInstalled 事件,该事件会在首次安装扩展程序(而非服务工作线程)时、扩展程序更新到新版本时以及 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

最后,系统会触发 service worker 的 activate 事件。请注意,与 Web Service Worker 不同,此事件会在扩展程序安装后立即触发,因为扩展程序中没有与页面重新加载类似的操作。

扩展程序启动

当用户个人资料启动时,系统会触发 chrome.runtime.onStartup 事件,但不会调用任何 Service Worker 事件。

空闲和关机

通常,当满足以下条件之一时,Chrome 会终止服务工作线程:

  • 无操作 30 秒后。接收到事件或调用扩展程序 API 会重置此计时器。
  • 当单个请求(例如事件或 API 调用)的处理时间超过 5 分钟时。
  • fetch() 响应的到达时间超过 30 秒时。

事件和对扩展程序 API 的调用会重置这些计时器,如果服务工作线程已进入休眠状态,则传入的事件会唤醒它们。不过,您应将 Service Worker 设计为能够抵御意外终止。

为了优化扩展程序的资源消耗,请尽可能避免让服务工作线程无限期保持活跃状态。测试您的扩展程序,确保您不是无意中这样做的。

持久保留数据,而不是使用全局变量

如果 Service Worker 关闭,您设置的任何全局变量都将丢失。请勿使用全局变量,而是将值保存到存储空间。系统会列出可供选择的选项。

chrome.storage API
一种提供多种类型存储空间的扩展程序 API;本地、会话、受管理(网域)和同步。此 API 用于存储通过开发者定义的键进行标识和检索的 JSON 对象。当用户清除 Web 缓存时,系统不会移除此类存储空间。
IndexedDB API
用于在客户端存储结构化数据(包括文件和 blob)的低级 API。此 API 提供用于创建事务性数据存储和检索的原语。虽然此 API 对于某些用例来说过于复杂,但许多第三方存储解决方案都是基于此 API 构建的。
CacheStorage API
一种用于存储请求和响应对象对的持久性存储机制。此 API 专为 Web 服务工作器而设计,用于从端点检索数据。此 API 的使用方式多种多样,具体取决于用户查看最新数据的需求程度。如需了解详情,请参阅离线 Cookbook。除非您专门使用提取处理程序代理网络请求,否则应使用 chrome.storage

选择最低 Chrome 版本

自发布清单 V3 以来,我们对服务工作线程生命周期进行了一些改进。这意味着,如果您的 Manifest V3 扩展程序支持旧版 Chrome,您需要了解一些条件。如果这些条件不会影响您的扩展程序,您可以跳过此部分。如果需要,请考虑在清单中指定最低 Chrome 版本

Chrome 120

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

Chrome 118

使用 chrome.debugger API 创建的有效调试器会话现在可使 service worker 保持有效状态。这样可防止服务工作线程在此 API 的调用期间超时。

Chrome 116

Chrome 116 引入了以下服务工作线程生命周期改进:

Chrome 114

使用持久消息传递发送消息可使 service worker 保持活跃状态。打开端口不再重置计时器。

Chrome 110

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

Chrome 109

从屏幕外文档发送的消息会重置计时器。

Chrome 105

使用 chrome.runtime.connectNative() 连接到原生消息传递主机将使服务工作线程保持活动状态。如果宿主进程崩溃或关闭,端口会关闭,并且服务工作线程会在计时器完成后终止。为防止出现这种情况,请在端口的 onDisconnect 事件处理程序中调用 chrome.runtime.connectNative()