「导航渲染流程」你真的知道从输入URL到页面展示发生了什么吗?(内附思维导图)

导航渲染流程


通过这篇文章当你被问到从URL输入到页面展示都发生了什么的时候,基本都能对答如流,甚至可以一直深入的说,说到面试官闭麦哈哈哈~


以下是本文的思维导图,直接拿图点个赞再走吧 ~ 求求了 ❀❀❀

(手机端可能看不清)获取高清PDF,请在微信公众号【小狮子前端Vue】回复【导航渲染流程】

从输入到页面渲染这个过程其实可以说得非常复杂,我这里总结的只是我通过在某网站上学习的课程【浏览器】所总结出来的,包括了两大步骤,一个是导航流程另一个是渲染流程;



一、导航流程


1.用户输入URL

不考虑用户输入搜索关键字的情况,
如果用户输入的内容符合URL规则,浏览器就会根据URL协议,在这段内容上加上协议合成合法的URL

2.loading状态

用户输入完内容,按下回车键,浏览器导航栏显示loading状态,但是页面还是呈现前一个页面,这是因为新页面的响应数据还没有获取到。

3.浏览器请求

浏览器进程浏览器构建请求行信息,会通过进程间通信(IPC)将URL请求发送给网络进程

GET /index.html HTTP1.1

4.网络进程处理

网络进程接收到url请求后检查本地缓存是否缓存了该请求资源:

  • 如果有缓存文件
    • 拦截请求,直接200返回
  • 无缓存文件
    • 进入网络请求过程

请求DNS(返回对应IP端口)

  • 缓存过当前域名信息
    • 直接返回缓存信息
  • 未缓存
    • 发起请求获取根据域名解析出来的IP和端口号

5.TCP三次握手建立连接

Chrome 有个机制,同一个域名同时最多只能建立 6 个TCP 连接,如果在同一个域名下同时有 10 个请求发生,那么其中 4 个请求会进入排队等待状态,直至进行中的请求完成。如果当前请求数量少于6个,会直接建立TCP连接。

TCP三次握手建立连接,http请求加上TCP头部——包括源端口号、目的程序端口号和用于校验数据完整性的序号,向下传输http请求加上TCP头部向下传输
三次握手建立连接详细过程

6.数据传输过程

网络层、传输层
在数据包上加上IP头部,继续向下传输到底层,底层通过物理网络传输给目的服务器主机

  • 网络层在数据包上加上IP头部——包括源IP地址和目的IP地址,继续向下传输到底层

目的服务器主机

  • 网络层,解析出IP头部,识别出数据部分
  • 传输层获取到数据包,解析出TCP头部,识别端口

应用层HTTP解析请求头和请求体
应用层HTTP解析请求头和请求体,如果需要重定向,HTTP直接返回HTTP响应数据的状态code301或者302,同时在请求头的Location字段中附上重定向地址,浏览器会根据codeLocation进行重定向操作;

如果不是重定向,首先服务器会根据 请求头中的If-None-Match 的值来判断请求的资源是否被更新,如果没有更新,就返回304状态码,相当于告诉浏览器之前的缓存还可以使用,就不返回新数据了;

否则,返回新数据,200的状态码,并且如果想要浏览器缓存数据的话,就在相应头中加入字段:Cache-Control:Max-age=2000

  • 重定向
    HTTP直接返回HTTP响应数据的状态code301或者302
    同时在请求头的Location字段中附上重定向地址
  • 不是重定向
    If-None-Match,没有更新,就返回304状态码;否则,返回新数据,200的状态码
    Cache-Control,想要浏览器缓存数据

响应数据又顺着应用层——传输层——网络层——网络层——传输层——应用层的顺序返回到网络进程

7.传输完成,TCP四次挥手


8.网络进程(数据包解析)

Content-type

网络进程将获取到的数据包进行解析,根据响应头中的Content-type来判断响应数据的类型

  • 如果是字节流类型,就将该请求交给下载管理器,该导航流程结束,不再进行

  • 如果是text/html类型,就通知浏览器进程获取到文档准备渲染

9.渲染进程(渲染进程的主进程)

浏览器会发出“提交文档”的消息给渲染进程,渲染进程收到消息后,会和网络进程建立传输数据的“管道”,文档数据传输完成后,渲染进程会返回“确认提交”的消息给浏览器进程

  • 网络进程建立传输数据的“管道”
  • 确认提交给浏览器进程

10.浏览器(更新页面状态)

浏览器收到“确认提交”的消息后,会更新浏览器的页面状态,包括了安全状态、地址栏的 URL、前进后退的历史状态,并更新web页面,此时的web页面是空白页

此时的web页面是空白页,以下列举了三种状态更新

  • 安全状态
  • 地址栏的 URL
  • 前进后退的历史状态

二、渲染流程(可以看成步骤9的补充)

导航被提交后又会怎么样呢?就进入了渲染阶段。

主线程


1.DOM树

HTML通过HTML解析器解析输出DOM树。
下面的HTML代码会被解析成上面这种浏览器可以理解的DOM树结构:
在这里插入图片描述

2.Style样式计算

  • 把 CSS 转换为浏览器能够理解的结构–styleSheets
    这里一CSDN为例可以看到它最新的styleSheets,会包含引用的外部 CSS 文件、</style>标记内的 CSS、以及内嵌的 CSS;

  • 标准化样式表属性值
    将所有值转换为渲染引擎容易理解的、标准化的计算值,这个过程就是属性值标准化。 1em 被解析成 1pxred 被解析成了 rgb(255,0,0)等等。

  • 计算 DOM 树每个节点的具体样式
    最终的样式可以通过控制台element的Computed查看,关于是怎么计算,涉及继承规则和层叠规则,这里就不细讲了。

3.Layout 布局树

  • 创建布局树:遍历 DOM 树中的所有可见节点,加到布局树中。对display:none的就忽略不加。
  • 布局计算:计算布局树节点的坐标位置。

4.layer 图层绘制列表

浏览器的页面实际上被分成了很多图层,这些图层叠加后合成了最终的页面。通常情况下,并不是布局树的每个节点都包含一个图层,如果一个节点没有对应的层,那么这个节点就从属于父节点的图层。

进入Layer页面,操作按钮从左至右功能依次为:平移、旋转、复位。见图:

5.Pain 图层绘制

可以想象你画画,先画远处再画近处,图层绘制也是这种原理。图层绘制阶段,输出待绘制列表。


合成线程


6.栅格化(tiles图块、raster光栅化)

在有些情况下,有的图层很大,但是通过视口,用户只能看到页面的很小一部分,所以在这种情况下,要绘制所有图层内容的话,就会产生太大的开销,而且也没有必要。

也是因为这个原因,合成线程会将图层进行分块划分为图块然后再栅格化,将图块转换为位图,而渲染进程通常不做或者做不来格栅化,需要跨进程,使用 GPU 来加速生成,使用 GPU 生成位图的过程叫快速栅格化,或者 GPU 栅格化,生成的位图被保存在 GPU 内存中。

7.Display 合成和显示

图块都被光栅化,合成线程就会生成一个绘制图块的命令——“DrawQuad”提交给浏览器进程。

浏览器进程接收 DrawQuad 命令,根据 DrawQuad 命令,将其页面内容绘制到内存中,最后再将内存显示在屏幕上。

至此页面就被渲染出来了~~完结撒花❀❀❀


渲染流程总结

贴心的我又对上述难理解的知识做了总结,并且还准备了图,确定不点个赞⭐️支持一下嘛~

渲染页面主要做的事:

  • 1.将浏览器无法直接理解和使用的HTML,转换为浏览器能够理解的结构–DOM 树
  • 2.把 CSS 转换为浏览器能够理解的结构–styleSheets,并转换样式表中的属性值,使其标准化,计算出 DOM 树中每个节点的具体样式(根据继承规则和层叠规则)。
  • 3.确定DOM 元素的几何位置信息–布局树,遍历 DOM 树中的所有可见节点,加入到布局树(display:none不包含),并计算布局树节点的坐标位置。
  • 4.如果页面有复杂的效果,如常见的页面滚动,或者使用 z 轴排序等,为了更加方便地实现这些效果,渲染引擎还需要为特定的节点生成专用的图层,并生成一棵对应的图层树(LayerTree)。
  • 5.图层绘制,把一个图层的绘制拆分成很多小的绘制指令,然后再把这些指令按照顺序组成一个待绘制列表(联想自己画画)。
  • 6.tiles:将图层转换成图块。
  • 7.光栅化:通过进程实现图块转换成位图。
  • 8.display:浏览器进程拿到DrawQuad信息生成页面显示。
DOM 和 HTML 内容几乎是一样的,但是和 HTML 不同的是,DOM 是保存在内存中树状结构,可以通过 JavaScript 来查询或修改其内容。

贴心的我也为你们做了一张图:
渲染流程

点个赞再走吧 ~ 求求了 ❀❀❀ 能一键三连的话那就更好啦~,你的支持是我继续写作的动力⭐️

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,我了解了。关于您的问题,整个过程可以分为以下几个步骤: 1. 输入URL:当您在浏览器地址栏中输入URL时,浏览器会将该URL发送到域名系统(DNS),通过域名系统将URL转化为IP地址。 2. 发送HTTP请求:浏览器根据URL发起HTTP请求,请求访问Web服务器的特定资源。 3. 服务器响应:当Web服务器接收到请求时,它将处理请求并返回所请求的资源。 4. 浏览器渲染浏览器收到服务器响应后,它将解析HTML源代码,并根据CSS样式表和JavaScript代码来渲染页面。 5. 页面展示:最终,浏览器将HTML、CSS和JavaScript代码解析完毕后,它会在屏幕上展示页面内容。 以上就是从输入URL页面展示的整个过程,希望能够帮到您。 ### 回答2: 当我们在浏览器的地址栏中输入URL时,整个过程可以分为以下几个步骤: 1. DNS解析:浏览器首先会根据URL中的域名(例如www.example.com)进行DNS解析,将域名解析为对应的IP地址。这一步骤是为了找到存放网页的服务器。 2. 建立TCP连接:浏览器通过IP地址与服务器建立TCP连接。TCP协议提供可靠的连接,确保数据的完整性。 3. 发起HTTP请求:一旦建立了TCP连接,浏览器会向服务器发起HTTP请求,请求包括请求方法、请求头、请求体等信息。请求方法可以是GET、POST等,服务器根据请求的不同做出相应的响应。 4. 服务器处理请求并响应:服务器接收到浏览器的请求后,会根据请求的内容进行相应的处理。处理包括读取数据库、执行后端代码等操作。之后,服务器会生成响应对象,包含响应状态码、响应头、响应体等信息。 5. 接收服务器响应:浏览器接收到服务器的响应后,根据响应头中的Content-Type确定响应的数据类型。如为HTML类型,则浏览器会将响应的HTML代码解析成DOM树。 6. 解析页面渲染浏览器根据DOM树构建渲染树,并依据CSS样式对各元素进行布局和样式计算,最终生成页面渲染结果。同时,浏览器也会执行页面中的JavaScript代码。 7. 页面展示:最后,浏览器渲染好的页面内容显示在用户的视窗中,用户可以看到页面展示效果。 总结起来,从输入URL页面展示,经历了DNS解析、建立TCP连接、发起HTTP请求、服务器处理请求并响应、接收服务器响应、解析页面渲染等多个步骤。最终,浏览器渲染好的页面内容显示给用户。 ### 回答3: 从输入URL页面展示,大致经历如下步骤: 1. 域名解析:当我们在浏览器输入URL后,首先会进行域名解析。浏览器会向DNS服务器发送域名请求,获取该域名对应的IP地址。 2. 建立连接:浏览器通过获取到的IP地址与Web服务器建立TCP连接。这个过程使用的是三次握手协议,确保连接的可靠性。 3. 发送请求:建立连接后,浏览器会发送HTTP请求给Web服务器,请求的内容包括请求的类型(GET/POST等)、地址、头部信息、可能还包括cookie等相关信息。 4. 服务器处理请求:Web服务器收到请求后,会根据请求内容进行处理。处理过程可能包括调取数据库、运行后台程序等动作。 5. 服务器响应:Web服务器根据请求的内容,返回一个HTTP响应给浏览器。响应的内容包括状态码、响应头部、实际的网页内容等。 6. 下载页面资源:浏览器接收到服务器返回的响应后,会开始下载网页的资源,如HTML、CSS、JavaScript、图片等。浏览器会根据响应头部中的Content-Type确定如何解析资源。 7. 页面渲染:当所有的资源下载完成后,浏览器会根据HTML结构、CSS样式,解析并渲染出网页。浏览器会从上到下解析HTML文档,解析过程包括构建DOM树、计算CSS样式、布局页面等。 8. JavaScript执行:在渲染过程中,浏览器会遇到JavaScript代码。浏览器会逐行解析执行JavaScript代码,并根据代码修改DOM树和样式,可能还会触发网络请求等。 9. 页面展示:当页面渲染和JavaScript执行完成后,页面便可以完整地展示给用户了。用户可以看到页面内容,与页面进行交互。 以上仅是一个大致的过程,实际上还有很多细节和额外的步骤,比如缓存机制、重定向、Cookie处理等等。不同的浏览器、服务器也可能会有些许差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值