HTTP请求与缓存、页面渲染全流程

文章目录

  • 前言
    • **1. HTTP请求与缓存处理**
      • **缓存机制**
        • • 强缓存(Cache-Control / Expires)
        • • 协商缓存(Last-Modified / ETag)
    • **2. 服务器响应与数据解析**
    • **3. HTML DOM 构建**
    • **4. CSSOM 构建**
    • **5. 渲染树(Render Tree)生成**
    • **6. 布局(Layout / Reflow)**
    • **7. 绘制(Painting)**
    • **8. 合成(Compositing)与显示**
    • **总结:从请求到渲染的完整流程**


前言

HTTP请求与缓存、页面渲染全流程

当用户在浏览器输入URL并按下回车,到页面最终渲染到屏幕上,整个过程涉及多个关键步骤:

  1. HTTP请求与缓存处理
  2. 服务器响应与数据解析
  3. HTML DOM 构建
  4. CSSOM 构建
  5. 渲染树(Render Tree)生成
  6. 布局(Layout/Reflow)
  7. 绘制(Painting)
  8. 合成(Compositing)与显示

1. HTTP请求与缓存处理

浏览器在发起HTTP请求前,会先检查缓存策略,以减少不必要的网络请求。

缓存机制

• 强缓存(Cache-Control / Expires)

• 浏览器检查Cache-Control(优先级更高)或Expires,判断资源是否过期。

• 如果未过期,直接从内存缓存(Memory Cache)或磁盘缓存(Disk Cache)读取,不发送HTTP请求。

• 示例:

```http
Cache-Control: max-age=3600  // 1小时内有效
Expires: Wed, 21 Oct 2025 07:28:00 GMT
```
• 协商缓存(Last-Modified / ETag)

• 如果强缓存失效,浏览器会向服务器发送请求,携带If-Modified-Since(基于Last-Modified)或If-None-Match(基于ETag)。

• 服务器检查资源是否变化:

◦ 304 Not Modified:资源未变,浏览器继续使用缓存。  ◦ 200 OK:资源已更新,返回新数据。  

• 示例:

```http
Last-Modified: Wed, 21 Oct 2025 07:28:00 GMT
ETag: "33a64df551425fcc55e4d42a148795d9"
```

2. 服务器响应与数据解析

• 服务器返回HTTP Response,包含:

• 状态码(200 OK / 304 Not Modified / 404 Not Found)

• 响应头(Content-TypeCache-Control等)

• 响应体(HTML、CSS、JS等)

• 浏览器解析流程:

  1. 解析HTML → 构建DOM树
  2. 解析CSS → 构建CSSOM树
  3. 执行JS(可能阻塞DOM/CSSOM构建)
  4. 合并DOM + CSSOM → 生成Render Tree(渲染树)
  5. 布局(Layout) → 计算元素位置
  6. 绘制(Paint) → 填充像素
  7. 合成(Composite) → 最终渲染到屏幕

3. HTML DOM 构建

• 解析HTML:

• 浏览器逐行读取HTML,遇到<script>会暂停解析,执行JS(除非async/defer)。

• 解析完成后,生成DOM树(Document Object Model)。

• DOM树结构:

<html><head><title>Page</title></head><body><div>Hello</div></body>
</html>

Document
├─ <html>
│   ├─ <head>
│   │   └─ <title>Page</title>
│   └─ <body>
│       └─ <div>Hello</div>

4. CSSOM 构建

• 解析CSS:

• 浏览器解析<style>、外部.css文件,生成CSSOM(CSS Object Model)。

• CSSOM是树状结构,决定元素的最终样式(层叠、继承、优先级)。

• 示例:

body { font-size: 16px; }
div { color: red; }

CSSOM
├─ body { font-size: 16px; }
└─ div { color: red; }

5. 渲染树(Render Tree)生成

• 合并DOM + CSSOM:

• 浏览器遍历DOM树,结合CSSOM,生成Render Tree(仅包含可见元素,如display: none不包含)。

• Render Tree = DOM + Computed Styles

• 示例:

Render Tree
├─ <html>
│   └─ <body>
│       └─ <div>Hello</div> (color: red, font-size: 16px)

6. 布局(Layout / Reflow)

• 计算元素位置:

• 浏览器计算每个节点的几何信息(宽、高、位置)。

• 回流(Reflow):布局变化(如窗口大小改变、DOM修改)会触发重新计算。

• 优化:

• 避免频繁修改DOM(使用DocumentFragment)。

• 使用transform代替top/left减少回流。


7. 绘制(Painting)

• 填充像素:

• 浏览器遍历Render Tree,调用GPU绘制每个节点(颜色、边框、阴影等)。

• 重绘(Repaint):样式变化但不影响布局(如color变化)仅触发重绘。

• 优化:

• 减少复杂选择器(如div > span + p)。

• 使用will-change提示浏览器优化绘制。


8. 合成(Compositing)与显示

• GPU合成:

• 浏览器将不同层(如position: fixedopacity)交给GPU合成。

• 最终渲染:合成后的图像显示在屏幕上。

• 优化:

• 使用transformopacity触发GPU加速(避免主线程计算)。


总结:从请求到渲染的完整流程

  1. HTTP请求 → 检查缓存(强缓存/协商缓存)。
  2. 服务器响应 → 返回HTML/CSS/JS。
  3. 解析HTML → 构建DOM树。
  4. 解析CSS → 构建CSSOM树。
  5. 合并DOM+CSSOM → 生成Render Tree。
  6. 布局(Layout) → 计算元素位置。
  7. 绘制(Painting) → 填充像素。
  8. 合成(Compositing) → GPU渲染到屏幕。

关键优化点
✅ 缓存:合理设置Cache-ControlETag减少请求。
✅ 减少DOM操作:避免频繁回流/重绘。
✅ CSS优化:减少选择器复杂度,使用transform/opacity
✅ JS优化:async/defer避免阻塞DOM解析。

这样,浏览器就能高效地从HTTP请求到最终渲染页面! 🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/79971.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

限流算法学习笔记(一)Go Rate Limiter

文章目录 1. 背景与概述1.1 什么是速率限制1.2 Go Rate Limiter 的定义与价值 2. 核心思想与设计理念2.1 令牌桶算法的基本原理2.2 惰性评估设计2.3 多种处理策略的平衡2.4 简单易用的偶发控制 3. 架构设计与组件3.1 整体架构3.2 Limiter 组件3.3 Reservation 组件3.4 Limit 类…

n8n工作流自动化平台的实操:生成统计图的两种方式

1.成果展示 1.1n8n的工作流 牵涉节点&#xff1a;Postgres、Code、QuickChart、Edit Fields、HTTP Request 12.显示效果 2.实操过程 2.1节点说明 2.1.1Postgres节点&#xff1a; 注&#xff1a;将明细数据进行汇总。 2.1.2code节点&#xff1a; 注&#xff1a;将 查询的数…

JavaScript中数组和对象不同遍历方法的顺序规则

在JavaScript中&#xff0c;不同遍历方法的顺序规则和适用场景存在显著差异。以下是主要方法的遍历顺序总结&#xff1a; 一、数组遍历方法 for循环 • 严格按数组索引顺序遍历&#xff08;0 → length-1&#xff09; • 支持break和continue中断循环 • 性能最优&#xff0c;…

缓存(1):三级缓存

三级缓存是指什么 我们常说的三级缓存如下&#xff1a; CPU三级缓存Spring三级缓存应用架构&#xff08;JVM、分布式缓存、db&#xff09;三级缓存 CPU 基本概念 CPU 的访问速度每 18 个月就会翻 倍&#xff0c;相当于每年增⻓ 60% 左右&#xff0c;内存的速度当然也会不断…

Android setContentView()源码分析

文章目录 Android setContentView()源码分析前提setContentView() 源码分析总结 Android setContentView()源码分析 前提 Activity 的生命周期与 ActivityThread 相关&#xff0c;调用 startActivity() 时&#xff0c;会调用 ActivityThread#performLaunchActivity()&#xf…

uniapp自定义步骤条(可二开进行调试)

前言 有一个业务需求是需要一个步骤条&#xff0c;但是发现开源的都不太合适&#xff0c;所以就自己写了一个。 开始 test.vue <template><view class"authenticateRecordDetails_container"><!-- 进度 --><view class"authenticateSte…

22、近端策略优化算法(PPO)论文笔记

近端策略优化算法&#xff08;PPO&#xff09;论文笔记 一、研究背景与目标二、**方法****3.1 策略梯度基础****3.2 信任区域方法&#xff08;TRPO&#xff09;****3.3 剪切代理目标函数&#xff08;LCLIP&#xff09;****3.4 自适应KL惩罚系数****3.5 算法实现** 三、 L CLIP…

web 自动化之 Selenium 元素定位和浏览器操作

文章目录 一、元素定位的八大方法1、基于 id/name/class/tag_name 定位2、基于 a 标签元素的链接文本定位3、基于xpath定位4、css定位 二、浏览器操作1、信息获取2、 浏览器关闭3、 浏览器控制 一、元素定位的八大方法 web 自动化测试就是通过代码对网页进行测试&#xff0c;在…

前端面经 作用域和作用域链

含义&#xff1a;JS中变量生效的区域 分类&#xff1a;全局作用域 或者 局部作用域 局部作用域&#xff1a;函数作用域 和 块级作用域ES6 全局作用域:在代码中任何地方都生效 函数中定义函数中生效&#xff0c;函数结束失效 块级作用域 使用let或const 声明 作用域链:JS查…

【C/C++】RPC与线程间通信:高效设计的关键选择

文章目录 RPC与线程间通信&#xff1a;高效设计的关键选择1 RPC 的核心用途2 线程间通信的常规方法3 RPC 用于线程间通信的潜在意义4 主要缺点与限制4.1 缺点列表4.2 展开 5 替代方案6 结论 RPC与线程间通信&#xff1a;高效设计的关键选择 在C或分布式系统设计中&#xff0c;…

两种方法求解最长公共子序列问题并输出所有解

最长公共子序列&#xff08;Longest Common Subsequence, LCS&#xff09;是动态规划领域的经典问题&#xff0c;广泛应用于生物信息学&#xff08;如DNA序列比对&#xff09;、文本差异比对&#xff08;如Git版本控制&#xff09;等领域。本文将通过​​自顶向下递归记忆化​​…

SpringBoot应急知识学习系统开发实现

概述 一个基于SpringBoot开发的应急知识学习系统&#xff0c;该系统提供了完整的用户注册、登录、知识学习与测评功能。对于开发者而言&#xff0c;这是一个值得参考的免费Java源码项目&#xff0c;可以帮助您快速构建类似的教育平台。 主要内容 5.2 注册模块的实现 系统采…

【Python 字符串】

Python 中的字符串&#xff08;str&#xff09;是用于处理文本数据的基础类型&#xff0c;具有不可变性、丰富的内置方法和灵活的操作方式。以下是 Python 字符串的核心知识点&#xff1a; 一、基础特性 定义方式&#xff1a; s1 单引号字符串 s2 "双引号字符串" s…

第十六届蓝桥杯大赛软件赛C/C++大学B组部分题解

第十六届蓝桥杯大赛软件赛C/C大学B组题解 试题A: 移动距离 问题描述 小明初始在二维平面的原点&#xff0c;他想前往坐标(233,666)。在移动过程中&#xff0c;他只能采用以下两种移动方式&#xff0c;并且这两种移动方式可以交替、不限次数地使用&#xff1a; 水平向右移动…

如何使用极狐GitLab 软件包仓库功能托管 npm?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 软件包库中的 npm 包 (BASIC ALL) npm 是 JavaScript 和 Node.js 的默认包管理器。开发者使用 npm 共享和重用代码&#xff…

Matlab 基于Hough变换的人眼虹膜定位方法

1、内容简介 Matlab220-基于Hough变换的人眼虹膜定位方法 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略

chili调试笔记14 画线 页面布置 线条导出dxf

2025-05-08 09-05-06 llm画线 页面布置 expand有自己的格式 删了就会按照子元素格式 不加px无效 没有指定尺寸设置100%无效 怎么把线条导出dxf command({name: "file.export",display: "command.export",icon: "icon-export", }) export class…

蓝绿发布与金丝雀发布

蓝绿发布与金丝雀发布 一、蓝绿发布&#xff1a;像「搬家」一样安全上线1. 生活化故事2. 技术步骤拆解步骤①&#xff1a;初始状态步骤②&#xff1a;部署新版本到绿环境步骤③&#xff1a;内部验证绿环境步骤④&#xff1a;一键切换流量步骤⑤&#xff1a;监控与回滚 3. 蓝绿发…

【2025五一数学建模竞赛B题】 矿山数据处理问题|建模过程+完整代码论文全解全析

你是否在寻找数学建模比赛的突破点&#xff1f;数学建模进阶思路&#xff01; 作为经验丰富的美赛O奖、国赛国一的数学建模团队&#xff0c;我们将为你带来本次数学建模竞赛的全面解析。这个解决方案包不仅包括完整的代码实现&#xff0c;还有详尽的建模过程和解析&#xff0c…

JavaSE核心知识点02面向对象编程02-02(封装、继承、多态)

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 JavaSE核心知识点02面向对象编程02-02&#…