发布时间:2025 年 1 月 20 日
从 Chrome 133(2025 年 2 月)开始,当节能模式处于启用状态时,系统会冻结符合条件且占用大量 CPU 的后台标签页。此功能旨在为依赖省电模式且电池续航时间每一百分比都至关重要的用户降低电池用量。为尽量减少干扰,系统只会冻结符合特定条件且 CPU 使用率较高的后台标签页。
什么是冻结?
冻结会暂停网页上的任务执行。其中包括:
- 事件处理脚本(例如输入、网络和传感器)
- 计时器
- Promise 解析器
冻结不同于舍弃,后者是指从内存中卸载标签页。当冻结的标签页重新获得焦点时,系统会自动解冻该标签页,并执行所有已加入队列的任务,而不会丢失状态。
当网页冻结或恢复时,系统会分派冻结和恢复事件(请参阅 Page Lifecycle API 文档)。借助这些事件,网页可以释放未使用的资源、通知服务器网页已暂停,或记录指标。
哪些网页可以冻结?
冻结将针对浏览情境组执行。通常,浏览情境组由单个标签页组成。不过,使用 window.open()
等 API 时,多个标签页可以属于同一组。
启用节能模式后,如果浏览情境组满足以下条件,则会被冻结:
- 该分组中的所有网页已隐藏且处于静音状态超过 5 分钟。
- 该组中同源框架的任何子组都是“CPU 密集型”。
- 该群组不:
- 提供音频或视频会议功能(使用麦克风、摄像头、屏幕/窗口/标签页截取或具有“打开”RTCDataChannel 或“实时”MediaStreamTrack 的 RTCPeerConnection 进行检测)。
- 控制外部设备(使用 Web USB、Web Bluetooth、Web HID 或 Web Serial 检测到的设备)。
- 保持 Web 锁或 IndexedDB 连接,以阻止组外的操作。
“CPU 密集型”的定义可能会发生变化,但其目的是排除高效实现的电子邮件或聊天客户端,或生成通知的日历应用。
同时冻结同一浏览上下文组中的所有标签页,可最大限度地减少使用弹出式窗口的应用(例如用于撰写邮件或输入凭据的应用)的干扰。
如何准备我的网站?
如果您的网站没有后台功能(例如通知、文件上传或内容刷新),则可能不会受到冻结的影响。
如果您的网站确实具有后台功能,请尽量减少其在后台的 CPU 使用率,以免被视为 CPU 密集型网站而被冻结。以下是一些提示:
- 避免使用计时器进行定期状态更改检查。
- 使用 IntersectionObserver 检测元素何时进入视口。
- 使用 ResizeObserver 检测元素大小变化。
- 针对 DOM 更改,请使用 MutationObserver 或自定义元素生命周期回调。
- 请考虑使用网络套接字、服务器发送的事件、推送消息或提取数据流,而不是轮询服务器。
- 使用 timeupdate 和 ended 等事件来跟踪音频或视频变化。
我们还建议将后台功能迁移到服务工件,以免其受到冻结的影响。除了不受冻结影响之外,服务工件还需要更少的浏览器资源。建议使用:
网站可以通过参与 BackgroundPageFreezeOptOut 源试用来选择停用冻结功能。一旦发布用于声明重要后台工作的新 API(例如 Progress Notification API),我们将停止此试行计划。
您可以在 chrome://discards
中查看标签页是否符合冻结条件。请注意,即使某个标签页符合冻结条件,Chrome 133 也只会在该标签页占用大量 CPU 且“能耗节省器”处于启用状态时将其冻结。
后续操作
背景标签页冻结功能可节省电量,这对启用了“能耗节省器”的用户来说至关重要。
它还可以通过减少 CPU 使用率和内存访问量来提高前台标签页性能,并有助于避免后台标签页终止(尤其是在资源受限的设备上)。因此,Chrome 将将标签页冻结功能扩展到更多情况(相关变更将在 blink-dev@chromium.org 上公布)。为尽可能减少对后台用例的影响,ProgressNotification API 等新 API 将允许页面声明重要的后台工作并防止冻结。