从输入 URL 到页面展示的过程
一、用户输入
当用户在浏览器地址栏中输入 URL,浏览器会利用智能匹配技术(例如历史记录和书签)提供输入建议。如果该网页的记录已存在于历史记录中,浏览器可能会从本地缓存中直接加载该页面。
二、DNS 解析
浏览器首先执行 DNS 解析,将域名转换成相应的 IP 地址。对于使用 HTTPS 协议的网站,浏览器还需要建立一个 TLS 连接。
注:DNS 解析结果可能在操作系统、浏览器或路由器等多个层级上缓存。
三、发送请求
- 建立 TCP 连接:通过三次握手过程与服务器建立稳定的 TCP 连接。
- 构建请求:浏览器构建完整的 HTTP 请求,包含请求方法、路径、版本和请求头信息(例如 Cookie)。
- 服务器响应:服务器处理收到的请求并返回相应的响应数据。
四、处理重定向
如果服务器返回 301 或 302 状态码,表示请求的资源已被重定向。浏览器将根据响应头中的 Location
字段自动重新发起请求。
五、处理响应
浏览器检查响应头的 Content-Type
,以决定如何处理响应体。例如,text/html
类型的内容将被处理为 HTML 文档。
六、准备渲染进程
浏览器为待渲染的页面分配一个渲染进程。如果新页面与当前页面属于同一站点,浏览器通常会复用现有的渲染进程。
七、构建 DOM 树和 CSSOM 树
- 浏览器解析 HTML 文档以构建 DOM 树。在遇到外部资源(如图片或脚本)时,浏览器会异步加载这些资源。
- 同时,浏览器解析 CSS 文件以构建 CSSOM 树。
深入了解:DOM 树的构建与 CSSOM 树的构建是并行进行的。由于 JavaScript 可能会查询和修改页面的样式,浏览器必须等待 CSSOM 树构建完成才能继续渲染过程。这解释了为何推荐在 HTML 文档的头部加载 CSS,以减少对页面渲染的阻塞。
八、JavaScript 处理
JavaScript 被浏览器的 JS 引擎解析和执行,过程中可能会修改 DOM 和 CSSOM。
注意:JavaScript 执行可能会阻止 DOM 的构建,尤其是当遇到
<script>
标签时,除非该标签被标记为异步(async
)或延迟(defer
)。
九、构建渲染树
浏览器将 DOM 与 CSSOM 结合,构建出渲染树,以确定页面上每个节点的样式。
说明:渲染树仅包含页面上可见的元素,对于不可见的元素(例如,那些应用了
display: none
样式的元素),不会被包含在渲染树中。
十、布局与绘制
- 布局(Layout):浏览器计算渲染树中每个节点的确切位置和大小。
- 绘制(Painting):根据布局和渲染树的信息,浏览器将每个节点绘制到屏幕上。
重要:布局和绘制过程在页面生命周期中可能会重复进行,不仅仅发生在页面初次加载时。例如,当用户的交互导致 DOM 改变时,也会触发重新布局和绘制。
十一、合成
浏览器将页面内容分割为多层,并进行合成,以展示最终的页面。这一步骤可以优化某些复杂动画和变换的性能,因为它们可以在不重新布局和绘制的情况下处理。
十二、交互
页面加载完成后,用户便可与页面进行交互,包括点击、滚动等操作。