发生这个过程的前提,用户在地址栏中输入了 URL,而地址栏会根据用户输入,做出如下判断:
URL 结构的字符串,则会用浏览器默认的搜索引擎搜索该字符串URL 结构字符串,则会构建完整的 URL 结构,浏览器进程会将完整的 URL 通过进程间通信,即 IPC,发送给网络进程在网络进程接收到 URL 后,并不是马上对指定 URL 进行请求。首先,我们需要进行 DNS 解析域名得到对应的 IP,然后通过 ARP 解析 IP 得到对应的 MAC(Media Access Control Address)地址。
域名是我们取代记忆复杂的
IP的一种解决方案,而IP地址才是目标在网络中所被分配的节点。MAC地址是对应目标网卡所在的固定地址。
DNS 解析域名的过程分为以下几个步骤:
host 文件)ISP(Internet Service Provider)互联网服务提供商(例如电信、移动)的 DNS 服务器递归和迭代两种查找的方式,两者都是先询问顶级域名服务器查找首先,建立 TCP 连接,即三次握手过程:
SYN 的数据包,表示我将要发送请求。SYN/ACK 的数据包,表示我已经收到通知,告知客户端发送请求。ACK 的数据包,表示我要开始发送请求,准备被接受。然后,利用 TCP 通道进行数据传输:
最后,断开 TCP 连接,即四次握手过程:
而这整个过程的客户端则是网络进程。并且,在数据传输的过程还可能会发生的重定向的情况,即当网络进程接收到状态码为 3xx 的响应报文,则会根据响应报文首部字段中的 Location 字段的值进行重定向,即会重新发起请求
当网络进程接收到的响应报文状态码,进行相应的操作。例如状态码为 200 OK 时,会解析响应报文中的 Content-Type 首部字段,例如我们这个过程 Content-Type 会出现 application/javascript、text/css、text/html,即对应 Javascript 文件、CSS 文件、HTML 文件。
详细的
MIME类型讲解可以看 MDN
渲染过程,是整个从浏览器输入 URL 到页面渲染过程的最后一步。而页面渲染的过程可以分为 9 个步骤:
1.构建 DOM 树 由于网络进程传输给渲染进程的是 HTML 字符串,所以,渲染进程需要将 HTML 字符串转化成 DOM 树。

需要注意的是这个 DOM 树不同于 Chrome-devtool 中 Element 选项卡的 DOM 树,它是存在内存中的,用于提供 JavaScript 对 DOM 的操作。
2.构建 CSSOM 构建 CSSOM 的过程,即通过解析 CSS 文件、style 标签、行内 style 等,生成 CSSOM。而这个过程会做这几件事:

CSS Object Model 是一组允许用 JavaScript 操纵 CSS 的 API。
3.加载 JavaScript 通常情况下,在构建 DOM 树或 CSSOM 的同时,如果也要加载 JavaScript,则会造成前者的构建的暂停。当然,我们可以通过 defer 或 sync 来实现异步加载 JavaScript。 虽然 defer 和 sync 都可以实现异步加载 JavaScript,但是前者是在加载后,等待 CSSOM 和 DOM 树构建完后才执行 JavaScript,而后者是在异步加载完马上执行, 即使用 sync 的方式仍然会造成阻塞。
而 JavaScript 执行的过程,即编译和运行 JavaScript 的过程。由于 JavaScript 是解释型的语言。所以这个过程会是这样的:
4.生成渲染树(Render Tree) 在有了 DOM 树和 CSSOM 之后,需要将两者结合生成渲染树 Render Tree,并且这个过程会去除掉那些 display: node 的节点。此时,渲染树就具备元素和元素的样式信息。
5.布局 根据 Render Tree 渲染树,对树中每个节点进行计算,确定每个节点在页面中的宽度、高度和位置。
需要注意的是,第一次确定节点的大小和位置的过程称为布局,而第二次才被称为回流(reflow)
6.分层 由于层叠上下文的存在,渲染引擎会为具备层叠上下文的元素创建对应的图层,而诸多图层的叠加就形成了我们看到的一些页面效果。例如,一些 3D 的效果、动画就是基于图层而形成的。
值得一提的是,对于内容溢出存在滚轮的情况也会进行分层
7.生成绘制列表 对于存在图层的页面部分,需要进行有序的绘制,而对于这个过程,渲染引擎会将一个个图层的绘制拆分成绘制指令,并按照图层绘制顺序形成一个绘制列表。
8.光栅化 有了绘制列表后,渲染引擎中的合成线程会根据当前视口的大小将图层进行分块处理,然后合成线程会对视口附近的图块生成位图,即光栅化。而渲染进程也维护了一个栅格化的线程池,专门用于将图块转为位图。
光栅化的过程通常会使用 GPU 加速,例如使用 wil-change、opacity,就会通过 GPU 加速显示
9.显示 当所有的图块都经过栅格化处理后,渲染引擎中的合成线程会生成绘制图块的指令,提交给浏览器进程。然后浏览器进程将页面绘制到内存中。最后将内存绘制结果显示在用户界面上。
而这个整个从生成绘制列表、光栅化、显示的过程,就是我们常说的重绘(repain)的过程