深入剖析:HTML页面从用户请求到完整呈现的多阶段加载与渲染全流程详解

在这里插入图片描述
HTML页面的加载全过程是一个涉及网络通信、文件解析、资源加载、渲染树构建、布局计算以及最终绘制等多个环节的复杂过程。以下是详细的步骤说明:

1. 用户输入URL并发送请求

用户在浏览器地址栏输入一个URL(统一资源定位符),或者点击一个链接,浏览器开始执行以下操作:

  • URL解析:浏览器首先解析URL,确定协议(如HTTP或HTTPS)、主机名(如www.example.com)、端口(默认为80或443)以及路径(如/path/to/page.html)。

  • DNS查询:浏览器通过DNS(域名系统)服务查找主机名对应的IP地址。如果缓存中有该域名的IP,直接使用;否则,发起DNS查询请求,获取IP地址。

  • TCP连接:浏览器根据协议(通常是TCP/IP)与服务器建立连接,通常涉及三次握手过程以确保可靠的数据传输通道。

2. 发送HTTP请求

建立连接后,浏览器构造并发送一个HTTP请求到服务器,请求头通常包含以下信息:

  • 请求方法:如GET(获取资源)或POST(提交数据)。

  • 请求URL:即之前解析出的路径。

  • HTTP版本:如HTTP/1.1或HTTP/2。

  • 请求头:包括但不限于:

    • Host:服务器的域名或IP地址。
    • User-Agent:浏览器标识信息。
    • Accept:客户端可以接受的内容类型列表。
    • Accept-Language:客户端首选的语言。
    • Cache-Control:缓存控制指令。
    • If-Modified-SinceETag:用于条件请求,检查资源是否已更新。
  • 请求体(仅适用于POST等方法):可能包含表单数据、JSON对象等提交给服务器的数据。

3. 服务器处理请求并返回响应

服务器接收到请求后,进行如下操作:

  • 路由解析:根据请求URL匹配相应的服务器端路由规则,确定要执行的操作或调用的服务。

  • 处理请求:执行相应的业务逻辑,如从数据库查询数据、调用API、生成动态页面等。

  • 生成响应:服务器根据请求结果构建HTTP响应,包括:

    • 状态码:如200(成功)、301(永久重定向)、404(未找到)等,表示请求的处理结果。

    • 响应头:包括但不限于:

      • Content-Type:响应内容的MIME类型。
      • Content-Length:响应体长度。
      • Last-ModifiedETag:资源的最后修改时间或唯一标识,用于缓存验证。
      • Set-Cookie:服务器设置的Cookie信息。
    • 响应体:实际返回的内容,对于HTML页面请求,通常就是HTML文档。

4. 浏览器接收响应并解析HTML

浏览器接收到服务器的HTTP响应后,开始进行以下操作:

  • 解析响应头:根据响应头信息确定如何处理响应内容,如是否缓存、如何解码等。

  • 解析HTML文档:浏览器的HTML解析器开始读取响应体(HTML文本),按照HTML语法结构逐行解析。

    • 构建DOM树:解析过程中,将HTML标签转化为DOM节点,形成一棵表示文档结构的DOM树。

    • 处理脚本标签:当解析到<script>标签时,根据其属性(如asyncdefersrc等)决定是否阻塞解析过程、是否异步加载外部脚本、何时执行脚本等。

    • 处理样式表:当解析到<link rel="stylesheet">标签时,浏览器发起CSS文件请求。收到CSS文件后,解析并构建CSSOM(CSS对象模型)。

  • 处理其他资源请求:解析HTML过程中,浏览器发现图片、字体、视频等外部资源链接,将分别发起HTTP请求获取这些资源。

5. 构建渲染树与样式计算

  • 合并DOM与CSSOM:浏览器将DOM树与CSSOM合并,生成渲染树(Render Tree)。渲染树只包含可见节点及其计算后的样式信息,隐藏节点(如display: none)不会出现在渲染树中。

  • 布局计算(Layout / Reflow):根据渲染树中各节点的几何信息(如宽高、位置等),浏览器进行布局计算,确定每个元素在视口内的确切位置。

  • 绘制(Painting):有了布局信息,浏览器按照渲染顺序,调用GPU(图形处理器)或其他绘图手段,将各个节点绘制到屏幕上。绘制过程可能涉及多个层(Layer),如背景层、普通内容层、叠加层等,以提高渲染效率。

6. 交互与事件处理

页面初步绘制完成后,浏览器开始处理用户交互:

  • 事件监听:浏览器注册对用户输入(如鼠标点击、键盘输入、滚动等)的事件监听器。

  • 事件触发与冒泡:当用户产生交互行为时,触发相应的事件,事件沿着DOM树向上冒泡(除非被阻止),对应的事件处理器被执行。

  • DOM更新与重绘/重排:JavaScript代码可能会修改DOM结构或样式,导致需要重新计算布局(重排)和重新绘制(重绘)受影响的部分。

7. 持续通信与资源加载

随着用户浏览和交互,浏览器可能需要:

  • 懒加载资源:对于设置了懒加载属性(如loading=lazy)的图片或IFrame,浏览器在满足条件(如滚动到可视区域附近)时才加载它们。

  • AJAX请求:JavaScript代码可能通过XMLHttpRequest或Fetch API发起异步请求,获取额外数据或更新页面内容。

  • 服务端推送(Server-Sent Events或WebSocket):浏览器可能接收来自服务器的实时数据更新,用于实现动态内容刷新。

整个HTML页面加载过程涉及网络、解析、渲染等多个层面,浏览器通过协调这些步骤,最终呈现出用户可见的交互式网页。随着Web技术的发展,诸如HTTP/2、HTTP/3、Service Workers、Web Components等新技术不断优化和丰富这个过程。

在这里插入图片描述

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

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

相关文章

【内存泄漏】数据库连接connectionPhantomRefs内存过大

1. 问题背景 线上出现内存报警&#xff0c;内存增长曲线如下 dump内存文件&#xff0c;临时重新发布服务。后经排查发现是数据库连接池设置不合理以及mysql-connector-java 5.1.49有内存泄漏bug。以下为对此问题的分析及问题总结。 1.1 应用背景 数据库连接池&#xff1a; …

[StartingPoint][Tier1]Ignition

Task 1 Which service version is found to be running on port 80? (发现哪个服务版本在端口 80 上运行&#xff1f;) $ nmap -sV -Pn 10.129.1.27 -p 80 nginx 1.14.2 Task 2 What is the 3-digit HTTP status code returned when you visit http://{machine IP}/? (访…

Centos7下docker安装jenkins

个人记录 安装Docker与Docker-compose Centos7安装Docker与Docker-compose【图文教程】 配置docker-compose.yml vim docker-compose.yml按i进行编辑模式&#xff0c;粘贴如下内容 version: 3 services:jenkins:image: jenkinsci/blueoceancontainer_name: jenkinsrestart…

剑指Offer题目笔记26(动态规划的基础知识)

面试题88&#xff1a; 问题&#xff1a; ​ 一个数组cost的所有数字都是正数&#xff0c;它的第i个数字表示在一个楼梯的第i级台阶往上爬的成本&#xff0c;在支付了成本cost[i]之后可以从第i级台阶往上爬1级或2级。请计算爬上该楼梯的最少成本。 解决方案一&#xff1a;&…

Java | Leetcode Java题解之第9题回文数

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isPalindrome(int x) {// 特殊情况&#xff1a;// 如上所述&#xff0c;当 x < 0 时&#xff0c;x 不是回文数。// 同样地&#xff0c;如果数字的最后一位是 0&#xff0c;为了使该数字为回文&#xff0…

Linux:数据链路层

文章目录 路由表数据链路层分片mac帧报头ARP协议ARP的周边话题 路由表 当主机a想要发送消息到主机b&#xff0c;这一整个过程中&#xff0c;数据报文在进行传输的过程实际上是一跳一跳的过去的&#xff0c;而报文可能会经过公网进行传递&#xff0c;本质上这些网络都是靠对应的…

【python毕业设计】基于Python的医院信息管理系统的设计与实现(源码+数据库+毕业论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

Google视觉机器人超级汇总:从RT、RT-2到AutoRT、SARA-RT、RT-Trajectory

前言 随着对视觉语言机器人研究的深入&#xff0c;发现Google的工作很值得深挖&#xff0c;比如RT-2 ​想到很多工作都是站在Google的肩上做产品和应用&#xff0c;​Google真是科技进步的核心推动力&#xff0c;做了大量大模型的基础设施&#xff0c;服 故有了本文&#xf…

【前端Vue】Vue0基础完整教程第5篇:vue指令(下),成绩案例【附代码文档】

Vue从0基础到大神学习完整教程完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;vue基本概念&#xff0c;vue-cli的使用&#xff0c;vue的插值表达式&#xff0c;{{ gaga }}&#xff0c;{{ if (obj.age > 18 ) { } }}&#xff0c;vue指令&#xff0c;综合…

更高效、更简洁的 SQL 语句编写丨DolphinDB 基于宏变量的元编程模式详解

元编程&#xff08;Metaprogramming&#xff09;指在程序运行时操作或者创建程序的一种编程技术&#xff0c;简而言之就是使用代码编写代码。通过元编程将原本静态的代码通过动态的脚本生成&#xff0c;使程序员可以创建更加灵活的代码以提升编程效率。 在 DolphinDB 中&#…

【Python系列】将生成的 JSON 数据写入 JSON 文件

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

面试经典-Spring篇

1、解释Spring框架中bean的生命周期 实例化 通过反射去推断构造函数进行实例化 实例工厂、静态工厂 属性赋值 解析自动装配&#xff08;byname、bytype、 constractor、 Autowired&#xff09; 循环依赖 初始化 调用XXXAware回调方法&#xff08;BeanNameAware、BeanFactoryAw…

移动Web学习05-移动端适配Less预处理器

7、移动端适配 7.1、什么是适配&#xff1f; 简单理解就是、同一个网页&#xff0c;在不同屏幕分辨率的设备下、显示还是一样的&#xff0c;你可以理解为、网页当中的图片&#xff0c;盒子之间的距离、文字的大小、随着屏幕分辨率的变化而变化 前面我们学习了flex布局的方式…

Yalmip使用教程(7)-求解器的参数设置

博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译&#xff1a;https://yalmip.github.io/tutorials/ 这篇博客将详细介绍yalmip工具箱中常用的求解器设置选项。 1.求解器的基本设置 使用sdpsettings函数可以对求解的相关参数进行设置。最常用的设置…

Java学习day6-集合

集合指一组用于储存和操作数据的类和接口&#xff0c;提供各种数据结构和算法&#xff0c;以在程序中高效地管理和操作数据 特点&#xff1a;与数组相比&#xff0c;集合可以自动扩容&#xff0c;只需向其中添加元素即可&#xff08;与Cvector类似&#xff09;&#xff1b;数组…

软考之零碎片段记录(七)+复习巩固(二)

一、上新 1. 有向图 从顶点A到顶点B的边&#xff0c;不等于从B到A的边。 2. 广度优先 遍历开始节点&#xff08;第一层&#xff09;的邻节点&#xff08;从左至右顺序&#xff09;&#xff0c;邻接点设为第二层根据1中遍历邻接点从左往右的顺序遍历。 bilibili视频《广度优…

《C++程序设计》阅读笔记【5-引用】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;《C程序设计》阅读笔记 本文对应的PDF源文件请关注微信公众号程序员刘同学&#xff0c;回复C程序设计获取下载链接。 1 引用1.1 概念1.2 和引用相关的操作1.2.1 什么能被引用 1.3 用引用传…

WebKit结构揭秘:探秘网页渲染的魔法之源

一、WebKit之心&#xff1a;渲染引擎的魔力 WebKit的渲染引擎是其核心所在&#xff0c;它犹如一位技艺高超的魔法师&#xff0c;将HTML、CSS和JavaScript的魔法咒语转化为绚丽的网页画面。它解析代码&#xff0c;绘制页面&#xff0c;让网页内容跃然屏上&#xff0c;展现出无尽…

ROS 2边学边练(15)-- 写一个简单的服务(C++)

前言 此篇我们即将编写一个简单的服务&#xff08;service&#xff09;通信例子&#xff0c;客户端节点向服务端节点发出请求&#xff08;.srv文件中规定了通信的数据结构格式&#xff09;&#xff0c;服务端节点收到请求后将结果回复给客户端节点&#xff0c;一问一答&#xf…

Unity类银河恶魔城学习记录12-4 p126 Item Tooltip源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI.cs using System.Collections; using System.Collections.Generic; usi…