现在,只要扩展程序 Service Worker 正在接收事件,它们就可以保持活动状态。这提高了扩展程序 Service Worker 的可靠性,但存在一个您应该避免的陷阱。
从 Chrome 110(自 2023 年 2 月 7 日起的 Beta 版)开始,扩展程序 Service Worker 在接收事件期间会一直保持活动状态。这纠正了之前实现 Extensions Service Worker 中的计时问题。当新事件在事件队列中时,可能会发生超时;如果发生超时,则异步工作会被截断。此项改进消除了扩展程序 Service Worker 只能强制最长 5 分钟的生命周期。
本文介绍了这些行为发生了哪些变化。
背景
扩展 Service Worker 的行为大体上类似于 Web Service Worker,但除了 Service Worker 事件之外,扩展 Service Worker 还可以监听扩展程序事件。虽然常规 Service Worker 事件会延长 Service Worker 的生命周期,但在 110 版本发布之前,只有少数扩展程序平台事件可以使扩展程序 Service Worker 保持活动状态。
通常,Chromium 会在满足以下任一条件后终止 Service Worker:
- Service Worker 超过三十秒未收到事件,并且没有正在执行的长时间运行的任务。如果 Service Worker 在这段时间内收到事件,则会移除空闲计时器。
- 长时间运行的任务需要五分钟以上才能完成,并且在过去的 30 秒内未收到任何事件。
在空闲计时器或长时间运行的任务计时器到期之前收到的新 Service Worker 事件会重置计时器并延长 Service Worker 的生命周期。
遗憾的是,此行为不适用于扩展程序事件。Extension 事件可以唤醒扩展程序 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 拍摄,由 Un 创立网站