深入剖析:按下 F5 后,浏览器前端究竟发生了什么?

按下 F5 后,浏览器前端究竟发生了什么?

当你按下 F5(或点击刷新按钮、输入回车)时,浏览器会启动一次完整的页面重新加载流程。这个过程涉及浏览器、网络、服务器、缓存策略、JavaScript 执行引擎等多个层面。

下面按真实时间线执行顺序,完整拆解一次典型的 F5 刷新在浏览器前端到底发生了什么(以现代 Chromium 内核浏览器为例,2025–2026 主流行为)。

1. 用户按下 F5 → 浏览器的第一反应(~0–10ms)

  • 浏览器接收到刷新意图
  • 检查当前页面是否处于**“可恢复状态”**(比如正在播放视频、表单有未提交内容)
    • 如果有 beforeunload 事件监听 → 弹出“确定要离开此页面吗?”确认框
    • 用户点击“离开”或没有监听 → 继续
  • 浏览器决定本次刷新的导航类型(Navigation Type):
    • reload(普通 F5)
    • reload-bypass-cache(Ctrl + F5 / Cmd + Shift + R)
    • history navigation(前进/后退)

2. 决定是否使用缓存(Cache-Control / ETag / Last-Modified 判断)

这是 F5 和 Ctrl+F5 行为差异最大的地方:

操作方式浏览器行为是否强制重新请求主文档是否检查子资源缓存
普通 F5正常重新加载(revalidate)通常 yes(取决于 Cache-Control)优先检查缓存(304 可复用)
Ctrl + F5强制绕过缓存(force reload)强制重新请求(no-cache)强制重新请求所有子资源
地址栏回车类似普通 F5(但部分浏览器更倾向复用缓存)同普通 F5同普通 F5

主文档(HTML)的缓存决策流程(最关键):

  1. 检查 Cache-Control 响应头
    • no-cache / no-store → 必须重新请求
    • max-age=0 / 已过期 → 发起条件请求(带 If-Modified-Since / If-None-Match)
    • 还在有效期内 → 直接使用缓存(200 from disk/memory cache)
  2. 如果需要验证 → 发送带条件头的请求:
    • If-None-Match: "etag值"
    • If-Modified-Since: 上次修改时间
  3. 服务器返回:
    • 304 Not Modified → 使用本地缓存
    • 200 OK + 新内容 → 使用新内容

3. 浏览器开始真正的加载流程(Navigation Start)

按时间线顺序:

  1. beforeunload 事件(如果有)
    → 页面可以弹窗阻止离开(最常见是表单未保存提醒)
  2. unload 事件(老旧,不推荐依赖)
    → 现代浏览器几乎不保证执行
  3. 页面被清空(~10–50ms)
    • 销毁当前页面所有 DOM
    • 终止所有运行中的 JavaScript 执行上下文(除非是 SharedWorker/ServiceWorker)
    • 清空绝大多数内存中的 JS 对象(但部分缓存可能保留)
  4. 创建新的浏览上下文(Browsing Context)
    • 新建一个“空白画布”
    • 触发 navigation start
  5. 发起主资源请求(HTML)
    • DNS 解析(若无缓存)
    • TCP 三次握手(若无连接复用)
    • TLS 握手(HTTPS)
    • 发送 HTTP 请求(带 Cookie、Referer、User-Agent 等)
  6. 接收到 HTML 响应
    • 浏览器开始流式解析(不是等全部下载完再解析)
    • 构建 DOM Tree(HTML Parser)
    • 遇到 <script><link><img> 等 → 发起子资源请求

4. 关键的解析与执行阶段(最容易被忽视的部分)

阶段发生什么是否阻塞渲染典型耗时占比
HTML Parsing构建 DOM Tree中等
CSSOM 构建解析 CSS → 构建 CSSOM阻塞渲染(Render-Blocking)中等
Preload / Early Hints103 Early Hints / link rel=preload提前发起关键资源请求优化关键
JavaScript 执行执行同步 <script>、async/defer 策略同步阻塞、async 不阻塞波动最大
Pre-parser / Speculative浏览器猜测下一个资源提前下载现代优化
Style Recalculation计算 CSS 规则 → 生成 Computed Style中等
Layout (Reflow)计算每个元素的位置、大小(Layout Tree)耗时最长阶段之一
Paint生成图层、栅格化 → 绘制到屏幕中等
Composite图层合成 → GPU 加速最终画面通常很快

5. F5 刷新时 JavaScript 的几种命运

脚本类型F5 普通刷新时行为Ctrl+F5 时行为是否保留状态
同步 <script>重新下载 + 重新执行强制重新下载 + 执行丢失
<script async>可能从缓存执行(取决于 Cache-Control)强制重新下载 + 执行丢失
<script defer>同 async同 async丢失
内联 <script>直接重新执行(不发请求)直接重新执行丢失
Service Worker可能继续拦截(除非 unregister)可能被更新可能保留
localStorage / IndexedDB保留(不随刷新清空)保留保留
sessionStorage刷新保留,关闭标签页清空刷新保留保留

6. 现代浏览器对 F5 的若干优化(2025–2026)

  • bfcache(Back/Forward Cache):部分浏览器在后退/前进时使用内存快照,而非重新请求
  • 103 Early Hints:服务器提前返回子资源链接,浏览器提前预加载
  • HTTP/2 & HTTP/3:连接复用、多路复用、0-RTT 复用
  • Cache Partitioning:防止跨站点追踪(Top-level site + frame 的组合 key)
  • Speculation Rules:预渲染 / 预取(Chrome 等)

总结:按下 F5 后真正发生了什么(一句话版)

浏览器清空当前页面 → 发起主文档请求(可能带条件头)→ 流式解析 HTML → 并行加载 CSS/JS/图片 → 构建 DOM + CSSOM → 执行 JS → 计算样式 → 布局 → 绘制 → 合成 → 显示新页面。

普通 F5 ≈ “有条件重新验证 + 复用大部分子资源缓存”
Ctrl + F5 ≈ “强制重新获取所有资源,相当于第一次访问”

想深入哪个环节?
A. 浏览器缓存策略全解(Cache-Control、ETag、Vary 等)
B. F5 时 JavaScript 重新执行的详细生命周期
C. bfcache 与普通刷新的区别(后退/前进 vs F5)
D. HTTP/3 + Early Hints 如何让 F5 更快
E. Chrome DevTools Network 面板如何看清整个过程

告诉我字母,我们继续深挖!

Read more

Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务-适配鸿蒙 HarmonyOS ohos

Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务-适配鸿蒙 HarmonyOS ohos

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 wasm_ffi 深入鸿蒙端侧硬核 WebAssembly 虚拟机沙盒穿透适配全景:通过异步极速 FFI 中继管道打通底层高算力异构服务并全面实现无损语言壁垒交互 前言 在 OpenHarmony 应用向高性能计算领域扩展的过程中,如何优雅地接入已有的 C/C++ 算法库(如加密引擎、重型图像处理、数学模拟)而又不失跨平台的便捷性?传统的 NAPI 虽然稳健,但在 Flutter 生态中,直接利用 WebAssembly (WASM) 配合 FFI(External Function Interface)的语义可以在一定程度上实现代码的高度复用。wasm_ffi 库为 Flutter 开发者提供了一套在 Dart 环境下调用 WASM

By Ne0inhk
三种适用于Web版IM(即时通讯)聊天信息的加密算法实现方案

三种适用于Web版IM(即时通讯)聊天信息的加密算法实现方案

文章目录 * **第一部分:引言与核心密码学概念** * **1.1 为什么IM需要端到端加密(E2EE)?** * **1.2 核心密码学概念与工具** * **第二部分:方案一:静态非对称加密(基础方案)** * **2.1 方案概述与流程** * **2.2 前端Vue实现(使用node-forge)** * **1. 安装依赖** * **2. 核心工具类 `crypto.js`** * **3. Vue组件中使用** * **2.3 后端Java实现(Spring Boot)** * **1. 实体类** * **2. Controller层** * **3. WebSocket配置** * **2.4 密钥管理、注册与登录集成** * **1. 用户注册/登录时生成密钥** * **2. 密钥设置页面** * **2.

By Ne0inhk
前端代码生成的大洗牌:当 GLM 4.7 与 MiniMax 挑战 Claude Opus,谁才是性价比之王?

前端代码生成的大洗牌:当 GLM 4.7 与 MiniMax 挑战 Claude Opus,谁才是性价比之王?

在 AI 辅助编程领域,长期以来似乎存在一条不成文的铁律:如果你想要最好的结果,就必须为最昂贵的模型买单(通常是 Anthropic 或 OpenAI 的旗舰模型)。然而,随着国产大模型如 GLM 4.7 和 MiniMax M2.1 的迭代,这一格局正在发生剧烈震荡。 最近,一场针对Claude Opus 4.5、Gemini 3 Pro、GLM 4.7 和 MiniMax M2.1 的前端 UI生成横向测评,打破了许多人的固有认知。在这场包含落地页、仪表盘、移动端应用等五个真实场景的较量中,不仅出现了令人咋舌的“滑铁卢”,更诞生了性价比极高的“新王”。 本文将深入拆解这场测试的细节,透过代码生成的表象,探讨大模型在工程化落地中的真实效能与成本逻辑。

By Ne0inhk
【Java Web学习 | 第14篇】JavaScript(8) -正则表达式

【Java Web学习 | 第14篇】JavaScript(8) -正则表达式

🌈个人主页: Hygge_Code🔥热门专栏:从0开始学习Java | Linux学习| 计算机网络💫个人格言: “既然选择了远方,便不顾风雨兼程” 文章目录 * JavaScript 正则表达式详解 * 什么是正则表达式🤔 * JavaScript 正则表达式的定义与使用🥝 * 1. 字面量语法 * 2. 常用匹配方法 * test() 方法🍋‍🟩 * exec() 方法🍋‍🟩 * 正则表达式的核心组成部分🐦‍🔥 * 1. 元字符 * 边界符 * 量词 * 字符类 * 2. 修饰符 * 简单示例🍂 JavaScript 正则表达式详解 正则表达式是处理字符串的强大工具,在 JavaScript 中被广泛应用于表单验证、文本处理和数据提取等场景。本文将从正则表达式的基本概念出发,详细介绍其语法规则和实际应用方法。 什么是正则表达式🤔 正则表达式是用于匹配字符串中字符组合的模式,在 JavaScript

By Ne0inhk