从输入URL到页面展示出来经历的流程
1. DNS解析
当用户在地址栏输入内容之后,浏览器会解析是否是URL,如果是URL开始进行DNS解析,解析过程分为如下几个步骤:
- 询问浏览器DNS缓存。
- 访问本地操作系统DNS缓存(即查找本地host文件)。
- 询问互联网服务提供商的DNS服务器。
- 询问根服务器。
2. 建立连接
浏览器执行完DNS解析拿到ip地址之后,根据ip地址和服务器进行通信建立连接。建立连接过程(三次握手)如下:
- 浏览器发送请求至服务器,表示我将要发送请求。
- 服务端接收到请求之后发送数据包给浏览器,表示我已经收到通知,告知浏览器发送请求。
- 浏览器发送请求,通知服务端我要开始发送请求。
3. 数据传输
三次握手完成之后,浏览器和服务端开始进行数据传输。数据传输过程如下:
- 浏览器发送请求,服务端在接收到数据包之后发送确认数据包已收到的消息到客户端,此过程不断重复直至数据发送完成。
- 浏览器在发送数据包后如未收到确认的消息将会重新发送该数据包,即TCP的重发机制。
- 服务端在接收完所有的数据包之后按照TCP头中的信息进行排序形成完整的数据包。
- 服务端处理数据包并发送结果至浏览器。
4. 断开连接
当数据传输完成后断开连接。断开连接的过程如下:
- 浏览器发送请求,申请断开连接,进入等待阶段,此时不会发送数据,但会继续接收数据。
- 服务端接收请求后,告知浏览器已明白,此时服务端进入等待状态,不会再接收数据,但会继续发送数据。
- 浏览器收到后,进入下一阶段等待。
- 服务端发送完剩余的数据后,告知浏览器可以断开连接,此时服务端不会发送和接收数据。
- 浏览器收到后,告知服务端我开始断开连接。
- 服务端收到后,开始断开连接。
5. 页面渲染
浏览器在接收完数据后,开始进行页面渲染。渲染过程如下:
- 根据HTML元素构建DOM树。
- 根据css构建CSSOM。此过程会进行规范css、计算元素样式(继承父级样式)。
- 在构建DOM树和CSSOM的过程中,如遇到同步加载的js会优先加载js。(可使用defer或sync实现异步加载)
- 根据DOM树和CSSOM生成Render Tree。
- 根据Render Tree对节点进行计算,确定每个节点在页面中的宽度、高度和位置。(第一次的过程未布局,第二次为回流)
- 为具备层叠上下文的元素创建对应的图层。
- 将图层的绘制拆分为绘制指令,并按照图层绘制顺序形成一个绘制列表。
- 有了绘制列表之后,浏览器根据当前视口的大小将图层进行分块处理,然后合成线程会对视口附近的图块生成位图。
- 将绘制结果显示在用户界面上。
补充
根据加载过程分析可以把js加载放到body下面或使用defer/sync来加快页面加载速度。