无需登录 数据私有 本地保存

页面生命周期事件演示 - freeze/resume等

13
0
0
0

页面生命周期事件演示

🟢

活跃 (Active)

页面可见且正在运行

实时状态信息
visibilityState: visible
document.hidden: false
hasFocus: true
wasDiscarded: false
bfcache检测: -
冻结检测: 未检测到
事件统计
❄️ 0 ▶️ 0 👁️ 0 📄 0 📑 0 🎯 0 🌫️ 0 ⚠️ 0 🔌 0
总事件数: 0 | 记录状态: 记录中
事件日志(最新在前)

等待事件触发... 试试切换标签页、最小化窗口、或打开新窗口

如何触发 freeze/resume?
  • Chrome桌面版:访问 chrome://discards/,找到本页面标签,点击 Freeze
  • 移动端Chrome:切换应用后等待一段时间,浏览器可能自动冻结后台页面
  • Safari (iOS/macOS):切换应用后系统可能冻结页面以节省资源
  • PWA应用:在移动设备上将PWA放入后台时更容易触发
关于心跳指示器

右上角的使用CSS动画持续脉冲。如果页面被冻结,动画将停止,恢复后继续。这是检测冻结的间接但直观的方法。冻结检测器也会通过RAF间隔异常来检测。

常见问题 (FAQ)

Page Lifecycle API 是一组用于管理网页生命周期的浏览器API,允许开发者响应页面状态的变化,如页面被隐藏、冻结、恢复、丢弃等。它包含 freezeresumevisibilitychangepageshowpagehide 等事件,以及 document.visibilityStatedocument.wasDiscarded 等属性。这些API帮助开发者优化资源使用,在页面不可见或冻结时暂停非必要任务,在恢复时重新激活。

freeze 事件在浏览器决定冻结页面时触发,通常发生在页面处于后台较长时间、设备资源紧张时。冻结后,页面的JavaScript执行、定时器、requestAnimationFrame等都会停止。
resume 事件在页面从冻结状态恢复时触发,允许开发者重新激活之前暂停的任务。在移动端浏览器和PWA中,这两个事件更为常见。桌面端Chrome可以通过 chrome://discards/ 手动触发冻结。

visibilitychange:当页面的可见性发生变化时触发(如切换标签页、最小化窗口)。此时页面可能仍然在运行JavaScript。
freeze:比visibilitychange更深入一层。当页面被冻结时,所有JavaScript执行完全停止,包括定时器和动画。freeze通常发生在页面已经不可见(hidden)之后的一段时间。可以理解为:visibilitychange(hidden) → 一段时间后 → freeze → 用户返回 → resume → visibilitychange(visible)。

bfcache(Back-Forward Cache,往返缓存)是浏览器的一种优化机制。当用户离开页面时,浏览器将完整页面状态保存在内存中,当用户点击后退/前进按钮返回时,页面可以瞬间恢复,无需重新加载。
当页面进入bfcache时,会触发 pagehide 事件,且 event.persistedtrue。当页面从bfcache恢复时,会触发 pageshow 事件,同样 event.persistedtrue。这与普通的页面隐藏/显示不同,可以用来区分bfcache场景。

visibilitychange:所有现代浏览器都支持,包括Chrome、Firefox、Safari、Edge。
pageshow/pagehide:所有现代浏览器都支持。
freeze/resume:Chrome 89+(桌面和移动端)、Edge 89+、Safari(iOS/macOS部分版本)、以及基于Chromium的浏览器支持较好。Firefox目前支持有限。
document.wasDiscarded:Chrome 68+支持,用于检测页面是否曾被浏览器丢弃后重新加载。
建议始终使用特性检测(feature detection)来检查API是否可用。

在PWA中,页面生命周期事件尤为重要:
1. freeze时:持久化应用状态到IndexedDB或localStorage,停止网络请求和动画。
2. resume时:恢复状态,重新建立连接,刷新过期数据。
3. visibilitychange(hidden)时:降低轮询频率,暂停视频播放。
4. visibilitychange(visible)时:恢复正常操作频率。
5. 结合 navigator.storage.persist() 请求持久存储,降低页面被丢弃的风险。

beforeunload:在页面即将被卸载时触发,可以用来提示用户保存未保存的数据(通过设置returnValue)。但它不可靠,现代浏览器对其支持有限,且会阻止bfcache。
pagehide:在页面被隐藏时触发(包括进入bfcache、关闭标签页等场景),event.persisted 可以区分是进入bfcache还是真正卸载。推荐使用pagehide来保存状态,因为它不会阻止bfcache。
最佳实践:使用pagehide保存状态,避免使用beforeunload(除非确实需要阻止用户离开),因为beforeunload会阻止bfcache,降低页面加载性能。

document.wasDiscarded 是一个只读布尔属性(Chrome 68+),用于检测当前页面是否在之前被浏览器丢弃(discard)后重新加载。丢弃比冻结更极端——页面完全从内存中移除,重新加载时相当于全新的页面加载。如果为true,说明页面之前被丢弃过,开发者可能需要恢复用户的状态。可以在页面加载时检查此属性,从存储中恢复之前的应用状态。