VP导航 VP导航
首页 提交网址

资讯文章 资讯 · NEWS

页面返回时为什么会闪一下:bfcache 的准入条件,和目录站常踩的那几条

2026-10-24 约 1,784 字 预计阅读 4 分钟 yiyunkj

页面返回时为什么会闪一下:bfcache 的准入条件,和目录站常踩的那几条 页

bfcache(往返缓存)不是 HTTP 缓存,它是浏览器在用户离开时把整个页面连 JS 堆一起留在内存里的一份快照。用户点后退,页面直接解冻显示,连 load 事件都不再触发,只有 pageshow,且它的 persisted 属性为 true。

所以在这个环节上,没有哪个 HTTP 缓存策略比它更快——那是绕过网络的量级。

bfcache 准入条件与常见阻断项对照示意

图片来源:网络,版权归原作者所有,侵权请联系删除

先知道值得做

Chrome 官方的使用数据:桌面端每 10 次导航有 1 次是前进或后退,移动端是每 5 次。移动端比例高的原因大家都懂,物理返回键比鼠标更随手。这意味着返还浏览路径上的体验,占据了你站点不少比例的流量,而这部分通常没人测。

Chrome 从 96 起在桌面和 Android 提供完整的 bfcache,Firefox 和 Safari 更早就有。

阻断项清单

阻断项具体表现处理办法
unload 监听器桌面 Chrome 与 Firefox 直接判不合格改用 pagehide 做收尾
Cache-Control: no-store主文档带上就失去资格换成 no-cache 或 private 组合
打开的连接WebSocket、WebRTC、未结束的 IndexedDB 事务在 pagehide 里关闭
window.opener仍持有引用加 rel=noopener 或置空
beforeunload 提示有待处理的弹窗只在真有未保存内容时挂上

其中两条特别容易被外部脚本带进来。unload 监听可能不是你写的——第三方统计的老版本 SDK 很爱用它做「最后一次发送」,结果是整个站都进不了 bfcache。所以自查必须覆盖页面上所有脚本,不只是自己的代码。

no-store 这笔账

很多人给页面加 no-store,理由是「页面里有用户信息」。但 Chromium 团队公开的数据里,这个头单独就阻断了移动端约 17% 的历史导航(桌面约 7%),是移动端最大的单一阻断原因。

真正需要「任何地方都别存」的,只有一次口令、 Token 下发这类页面。普通登录态的正确写法是 no-cache 或 private 组合:返回时的重校验会照常发生,换来的是这一页可以直接从内存恢复。

理解这一点要抓住一个事实:bfcache 的快照只存在于那个标签页的渲染进程内存里,不落盘、也不能被别的源读取。它和「写入磁盘的共享缓存」是两回事。

怎么知道到底卡在哪

本地用 DevTools 看后退时网络面板有没有新请求:没有请求就是从内存恢复,有请求就是普通加载。这只告诉你单次结果。

线上要看 performance.getEntriesByType('navigation')[0].notRestoredReasons(Chrome 125 起)。它返回一个带原因列表的对象,比如 unload-listener,跨域 iframe 的原因会被遮成 null——注意一个第三方 iframe 就可能把整个顶层页面拖下水,而这类问题是本地 DevTools 永远发现不了的那类,只有在真实流量里才看得见。建议把它作为常规指标上报。

恢复之后:状态可能过期

整页从内存回来,意味着收藏按钮的状态、购物车数量、登录态、条目是否已收录的角标,全是离开那一刻的样子。用户本地时间和你这边的服务器之间隔了几次操作,就可能出现不一致。

处理办法统一在 pageshow 里做,用 persisted 区分是不是恢复:

window.addEventListener('pageshow', (e) => {
  if (!e.persisted) return;   // 普通加载,业务自己的初始化已经跑过
  refreshSession();
  refreshBadge();
});
window.addEventListener('pagehide', () => {
  socket?.close();            // 关掉连接才进得去 bfcache
});

还有一个坑:恢复时 load 事件不会再触发。把关键初始化写在 load 里的代码等于没跑,这正是「页面回来之后什么都没动」最常见的解释。

三条落地建议

第一,把 bfcache 命中率做成指标,而不是一次优化。第三方脚本升级随时会把 unload 又带回来。

第二,所有用 target 打开新窗口的地方都要带上 rel=noopener,既是为了安全,也是为了避免留下 opener 引用。

第三,单页应用的站内 router 跳转不算 bfcache 作用域,它只管浏览器级的往返。别指望它解决 SPA 内部的前进后退。

本文标签 bfcache 往返缓存 页面返回能
← 上一篇 扩展商店审核被拒这条路:manifest v3 的权 下一篇 → 两个人同时改一条条目:事务隔离级别、乐观锁,和目录站

— 本文完 —

提交网址

发现好站,欢迎自荐收录

站内搜索

站点统计

  • 今日审核0
  • 已收录站点3744
  • 正常访问3738
  • 失联站点6
  • 累计访问175

网站分类

  • AI工具 0
    AI对话0 AI绘画0 AI写作0 AI编程0 AI音视频0 AI办公效率0
  • 开发编程 0
    前端开发0 后端开发0 移动开发0 开源与代码托管0 数据库0 开发文档与教程0
  • 设计素材 0
    UI设计0 图标素材0 免费图库0 字体下载0 配色工具0 设计模板0
  • 站长工具 0
    网站统计0 SEO工具0 域名与主机0 收录提交0 建站程序0 运维监控0
  • 学习教育 0
    编程教程0 语言学习0 职业技能0 公开课与慕课0 考试题库0 中小学教育0
  • 生活服务 0
    交通出行0 外卖点餐0 房产租房0 医疗健康0 政务办事0 快递物流0
  • 影音娱乐 0
    影视观看0 音乐音频0 游戏资源0 短视频直播0 小说阅读0
  • 电商购物 0
    综合商城0 比价工具0 导购返利0 二手交易0 团购优惠0
  • 综合其他 1
    实用工具0 资源合集0 小众站点0 个人博客0 论坛社区0
  • 新闻资讯 0
    科技资讯8 财经媒体1 行业动态0 社会热点0 综合门户0
  • 资讯文章 370

最新收录

  • 通义千问
  • Kimi
  • 车机屋-专业车机系统研究平台,海量正
  • 阿里巴巴矢量图标库
  • DeepSeek
  • 快看漫画
  • 苏宁易购
  • 埋点为什么总对不上数:目录站的事件模

浏览排行

  1. 满分作文网 6
  2. Let's Enhance 3
  3. 淘菜菜 3
  4. MasterClass 3
  5. TypeScript 中文网 3
  6. Zhengziying 3
  7. 得意生活 3
  8. 镇江网友之家 3

联系我们

bQ:12345678

电话:400-8888-888

邮箱:admin@example.com

时间:09:00-21:00

友情链接

车机屋·焊锡条·探兔AI导航·静电测试仪·大学生联盟

关于我们|广告合作|隐私条款|网站地图

原ICP备00000000号-1,@2026

由 Z-BlogPHP 驱动