前端与浏览器 / 进阶

页面生命周期:visibilitychange、pagehide 与 bfcache

解释页面可见性、冻结、销毁和往返缓存,可靠保存草稿与发送末尾统计。 用户离开页面时,beforeunload 往往不是你以为的最后机会。

bfcache 是完整页面快照

浏览器前进或后退时可能直接恢复页面,JavaScript 堆和 DOM 都被保留,不会重新执行普通初始化。pageshow 事件的 persisted 可判断是否从 bfcache 恢复。 恢复后要重新校验易过期数据、重连实时通道,并避免重复注册监听器。不要无条件监听 unload,它可能让页面失去 bfcache 资格。

EXAMPLE / 01Page Lifecycle
document.addEventListener('visibilitychange', () => {
  if (document.visibilityState !== 'hidden') return;
  saveDraftLocally(editor.getValue());
  navigator.sendBeacon('/analytics/session-end', JSON.stringify({
    path: location.pathname,
    duration: performance.now()
  }));
});

把实现拆成可验证的小块

bfcache 恢复不是一次全新加载

最后回到真实页面检查

持续保存比离开页面时抢救更可靠