现在,只要扩展程序服务 worker 正在接收事件,就可以保持活跃状态。这会提高扩展程序服务 worker 的可靠性,但存在一个您应避免的陷阱。
从 Chrome 110 开始(自 2023 年 2 月 7 日起处于 Beta 版阶段),只要扩展程序服务工保持接收事件,便会保持活跃状态。这修复了扩展程序服务工之前实现中的时机问题。当事件队列中存在新事件时,可能会发生超时,并且超时可能会截断异步工作。此项改进移除了扩展程序服务 worker 的 5 分钟硬性生命周期上限。
本文介绍了这些行为的变化。
背景
扩展程序 Service Worker 的行为与 Web Service Worker 大致相同,但除了 Service Worker 事件之外,扩展程序 Service Worker 还可以监听扩展程序事件。虽然常规的服务工件事件会延长服务工件的生命周期,但在 110 版发布之前,只有少数扩展程序平台事件会使扩展程序服务工件保持活跃状态。
通常,Chromium 会在满足以下任一条件后终止服务工件:
- 服务工件已超过 30 秒未收到事件,并且没有正在进行的待处理的长时间运行任务。如果服务工件在此期间收到了事件,系统会移除空闲计时器。
- 一个长时间运行的任务需要超过 5 分钟才能完成,并且在过去 30 秒内未收到任何事件。
在空闲计时器或长时间运行的任务计时器到期之前收到的新服务工件事件会重置计时器并延长服务工件的生命周期。
遗憾的是,此行为不适用于扩展程序事件。扩展程序事件可以唤醒扩展程序服务工作器,并使其保持活跃状态,直到事件完成为止,但无法延长 30 秒的空闲计时器。这实际上意味着,在最后一个扩展程序事件完成后,扩展程序服务工件可在任何时候终止,即使浏览器刚刚向扩展程序分派了一个新事件也是如此。
具体变化
从 Chrome 110 开始,所有事件都会重置空闲计时器,如果有待处理的事件,则不会发生空闲超时。换句话说,假设没有意外中断,现在只要扩展程序服务工件正在积极处理事件,通常就会保持活跃状态。此外,调用扩展程序专用 Chrome API(例如 chrome.storage.local.get()
)也会重置空闲超时。具体而言:
- 服务工件会在 30 秒后终止。(接收事件或调用扩展程序 API 会重置此计时器)。
- 如果单个请求(例如事件或 API 调用)的处理时间超过 5 分钟,服务工件将终止。
某些 API(如原生消息传递)提供强大的保活功能,可取消这两个计时器。
我们仍在努力确保尽可能终止扩展程序 Service Worker,而不关闭长时间运行的工作。注重资源的扩展程序服务工作器应始终尽可能让出。此外,扩展程序应通过保留状态来为意外终止做好准备。这样可以防范不可预知的事件,例如用户强行关闭浏览器。
照片由 Paula Guerreiro 拍摄,选自 Unsplash