Open Bulandent opened 3 years ago
URL
loading
IPC
DNS
IP
http
https
TLS
TCP
Chrome
HTTP
URI
Cookie
Locaiton
JSON
HTML
Connection: keep-alive
Content-type
text/html
web
文档一旦提交,渲染进程将开始页面解析和子资源加载;渲染阶段比较复杂,所以将分为多个子阶段,按照渲染的时间顺序可以分为:构建 DOM 树、样式计算、布局阶段、分层、绘制、分块、光栅化和合成;
DOM
构建 DOM 树:HTML 经过解析器后输出一个以 document 为顶层节点的树状结构的 DOM;
document
样式计算:这里有 3 个步骤:
<link>
<style>
style
CSS
styleSheets
font-weight: bold;
font-weight: 700;
color: blue;
color: rgb(0, 0, 255);
布局阶段:DOM 树中依然存在许多不可见的元素(比如 head),这些元素对于布局是丝毫没用的,所以又会生成一棵只包含可见元素的布局树;然后再根据布局树的每个节点计算出其具体位置和尺寸大小;
head
分层:页面中有很多复杂的效果,如一些复杂的 3D 变换、页面滚动,或者使用 z-index 做 z 轴排序等,为了更加方便地实现这些效果,渲染引擎还需要为特定的节点生成专用的图层,并生成一棵对应的图层树;关于层叠上下文的知识,具体可以参考这里彻底搞懂CSS层叠上下文、层叠等级、层叠顺序、z-index;
z-index
绘制:为每个图层生成绘制列表,并将其提交到合成线程;
光栅化:通常一个页面很大,而视口很局限,所以合成线程会按照视口附近的图块来优先生成位图,并在光栅化线程池中将图块转换成位图;
合成:一旦所有图块都被光栅化,合成线程就会生成一个绘制图块的命令 DrawQuad,然后将该命令提交给浏览器进程;之后浏览器将开始生成显示页面。
DrawQuad
用户输入阶段
URL
:用户输入URL
,浏览器会根据用户输入的信息判断是搜索还是网址,如果是搜索内容,就将搜索内容 + 默认搜索引擎合成新的URL
;如果用户输入的内容符合URL
规则,浏览器就会根据URL
协议,在这段内容上加上协议合成合法的URL
;loading
状态,但是页面还是呈现前一个页面,这是因为新页面的响应数据还没有获得;发起URL请求阶段
IPC
)将URL
请求发送给网络进程;URL
,先去本地缓存中查找是否有缓存资源,如果有则拦截请求,直接将缓存资源返回给浏览器进程;否则,进入网络请求阶段;DNS
解析:网络进程请求首先会从DNS
数据缓存服务中查找是否缓存过当前域名信息,有则直接返回;否则,会进行DNS
解析返回域名对应的IP
和端口号,如果没有指定端口号,http
默认 80 端口,https
默认 443。如果是https
请求,还需要建立TLS
连接;TCP
队列:Chrome
有个机制,同一个域名同时最多只能建立 6 个TCP
连接,如果在同一个域名下同时有 10 个请求发生,那么其中 4 个请求会进入排队等待状态,直至进行中的请求完成。如果当前请求数量少于6个,会直接建立TCP
连接;TCP
连接:TCP
三次握手与服务器建立连接,然后进行数据的传输,最后;HTTP
请求:浏览器首先会向服务器发送请求行,它包含了请求方法、请求URI
和HTTP
协议的版本;另外还会发送请求头,告诉服务器一些浏览器的相关信息,比如浏览器内核,请求域名、Cookie
等;如果需要传递参数,则还需要发送请求体;Locaiton
字段中加上重定向的地址信息,接下来浏览器获取这个地址,将会重新导航。)服务器也会向浏览器发送响应头,包含了一些信息,比如服务器生成返回数据的时间、返回的数据类型(JSON
、HTML
、流媒体等类型),以及服务器要在客户端保存的Cookie
等;继续发送响应体的数据;TCP
连接:数据传输完成,正常情况下TCP
将四次挥手断开连接。但是如果浏览器或者服务器在HTTP头部加上Connection: keep-alive
,TCP
就会一直保持连接。保持TCP
连接可以省下下次需要建立连接的时间,提示资源加载速度;准备渲染进程阶段
Content-type
来判断响应数据的类型,如果是字节流类型,就将该请求交给下载管理器,该导航流程结束,不再进行;如果是text/html
类型,就通知浏览器进程获取到的是HTML
,应该准备渲染进程了;提交文档阶段
URL
、前进后退的历史状态,并更新web
页面,此时的web
页面是空白页;页面渲染阶段
文档一旦提交,渲染进程将开始页面解析和子资源加载;渲染阶段比较复杂,所以将分为多个子阶段,按照渲染的时间顺序可以分为:构建
DOM
树、样式计算、布局阶段、分层、绘制、分块、光栅化和合成;构建
DOM
树:HTML
经过解析器后输出一个以document
为顶层节点的树状结构的DOM
;样式计算:这里有 3 个步骤:
<link>
标签引入的外部样式、<style>
标签里定义的样式、以及元素的style
属性上的样式)的CSS
转化成浏览器能够理解的结构styleSheets
;font-weight: bold;
会转成font-weight: 700;
、color: blue;
会转成color: rgb(0, 0, 255);
等;CSS
的继承和层叠规则计算出DOM
树中每个节点的具体样式;布局阶段:
DOM
树中依然存在许多不可见的元素(比如head
),这些元素对于布局是丝毫没用的,所以又会生成一棵只包含可见元素的布局树;然后再根据布局树的每个节点计算出其具体位置和尺寸大小;分层:页面中有很多复杂的效果,如一些复杂的 3D 变换、页面滚动,或者使用
z-index
做 z 轴排序等,为了更加方便地实现这些效果,渲染引擎还需要为特定的节点生成专用的图层,并生成一棵对应的图层树;关于层叠上下文的知识,具体可以参考这里彻底搞懂CSS层叠上下文、层叠等级、层叠顺序、z-index;绘制:为每个图层生成绘制列表,并将其提交到合成线程;
光栅化:通常一个页面很大,而视口很局限,所以合成线程会按照视口附近的图块来优先生成位图,并在光栅化线程池中将图块转换成位图;
合成:一旦所有图块都被光栅化,合成线程就会生成一个绘制图块的命令
DrawQuad
,然后将该命令提交给浏览器进程;之后浏览器将开始生成显示页面。