更长的扩展 Service Worker 生命周期

现在,只要扩展程序 Service Worker 在接收事件,就可以保持活跃状态。这可以提高扩展 Service Worker 的可靠性,但有一个您应该避免的陷阱。

Joe Medley
Joe Medley

从 Chrome 110(自 2023 年 2 月 7 日起的 Beta 版)开始,扩展程序 Service Worker 只要在接收事件,就会保持活跃状态。这纠正了先前扩展 Service Worker 实现中的时间问题。当事件队列中有新事件时,可能会发生超时,也可能会因超时而截断异步工作。这一改进消除了扩展程序 Service Worker 的 5 分钟硬性最长生命周期。

本文介绍了这些行为发生了哪些变化。

背景

扩展程序 Service Worker 的行为大多类似于 Web Service Worker,但除了 Service Worker 事件之外,扩展程序 Service Worker 还可以监听扩展程序事件。虽然常规 Service Worker 事件可延长 Service Worker 的生命周期,但在 110 版本发布之前,只有少数扩展平台事件使 Extensions Service Worker 保持活动状态。

通常,Chromium 会在满足以下条件之一后终止 Service Worker:

  • Service Worker 在过去 30 秒内未收到事件,并且没有待处理的长时间运行的任务。如果 Service Worker 在此期间收到事件,则空闲计时器会被移除。
  • 长时间运行的任务用了五分钟以上才能完成,并且在过去的 30 秒内未收到任何事件。

在空闲计时器或长时间运行的任务计时器到期之前收到的新 Service Worker 事件会重置计时器,并延长 Service Worker 的生命周期。

遗憾的是,此行为不适用于扩展程序事件。扩展程序事件可以唤醒扩展程序 Service Worker,并使其保持活动状态,直到事件完成为止,但它无法延长 30 秒的空闲计时器。这实际上意味着,在最后一个扩展程序事件完成后,扩展程序 Service Worker 可以随时终止,即使浏览器刚刚向扩展程序分派了新事件也是如此。

具体变化

从 Chrome 110 开始,所有事件都会重置空闲计时器,并且如果有待处理事件,则不会发生闲置超时。换言之,假设没有意外中断,那么,只要扩展程序 Service Worker 正在处理事件,那么现在通常会保持活动状态。此外,调用扩展程序专用 Chrome API(例如 chrome.storage.local.get())会重置空闲超时。具体而言:

  • Service Worker 会在处于不活动状态 30 秒后终止。(收到事件或调用扩展程序 API 会重置此计时器)。
  • 如果单个请求(例如事件或 API 调用)的处理时间超过 5 分钟,则 Service Worker 将终止。

一些 API(如原生消息传递)提供强大的 keep-alive 功能,可取消这两个计时器。

我们仍在努力确保在不关闭长时间运行的工作的情况下尽可能终止扩展程序 Service Worker。资源注重资源的扩展 Service Worker 应始终尽可能让步。此外,扩展程序还应通过保留状态来为意外终止做好准备。这是为了防止意外事件,例如用户强制关闭浏览器。

照片由 Paula Guerreiro 提供,由 Unsplash 提供