这是一个经典的前端面试题,从输入URL到页面渲染完成的全过程:

1. URL解析与DNS查询

URL解析

  • 浏览器解析输入的URL,提取协议(http/https)、域名、端口、路径等信息
  • 检查URL格式是否正确

DNS查询

  • 浏览器检查本地DNS缓存
  • 如果缓存中没有,依次查询:操作系统DNS缓存 → 路由器缓存 → ISP DNS服务器
  • 最终获得域名对应的IP地址

2. 建立TCP连接

  • 浏览器与服务器进行TCP三次握手建立连接
  • 如果是HTTPS,还需要进行TLS握手建立安全连接

3. 发送HTTP请求

  • 浏览器构造HTTP请求报文(包含请求行、请求头、请求体)
  • 通过TCP连接发送给服务器

4. 服务器处理请求

  • 服务器接收请求,解析请求内容
  • 根据请求路径查找对应资源
  • 执行服务器端逻辑(如果需要)
  • 构造HTTP响应报文

5. 浏览器接收响应

  • 接收服务器返回的HTML文档
  • 检查响应状态码(200、404、500等)
  • 开始解析HTML内容

6. 页面渲染过程

6.1 构建DOM树

  • 浏览器解析HTML标签,构建DOM(文档对象模型)树
  • 遇到外部资源(CSS、JS、图片等)时发起新的HTTP请求

6.2 构建CSSOM树

  • 解析CSS文件和内联样式,构建CSSOM(CSS对象模型)树
  • CSS解析会阻塞渲染

6.3 构建渲染树(Render Tree)

  • 将DOM树和CSSOM树合并,生成渲染树
  • 只包含可见元素(display:none的元素不在渲染树中)

6.4 布局(Layout/Reflow)

  • 计算每个元素在页面中的确切位置和大小
  • 这个过程也叫”回流”

6.5 绘制(Paint)

  • 将渲染树中的每个节点转换为屏幕上的实际像素
  • 包括颜色、阴影、边框等视觉效果

6.6 合成(Composite)

  • 将各个图层合成最终的页面
  • GPU加速的图层会在这个阶段处理

7. JavaScript执行

  • HTML解析过程中遇到<script>标签时会暂停DOM构建
  • 执行JavaScript代码(可能修改DOM和CSS)
  • 异步脚本(async/defer)不会阻塞HTML解析

8. 资源加载优化

并行加载

  • 浏览器可以并行下载多个资源(但有连接数限制)
  • 现代浏览器支持HTTP/2多路复用

缓存机制

  • 浏览器缓存、CDN缓存等减少重复请求
  • 强缓存和协商缓存提高加载速度

9. 页面完全加载

  • 所有资源加载完成
  • 触发DOMContentLoaded事件(DOM构建完成)
  • 触发load事件(所有资源加载完成)

面试加分点

性能优化相关

  • 提到关键渲染路径优化
  • DNS预解析、资源预加载
  • 代码分割、懒加载
  • CDN、HTTP/2等技术

深入技术细节

  • 浏览器的多进程架构
  • V8引擎的工作原理
  • 重排和重绘的区别及优化

实际应用

  • 结合具体的性能监控指标(FCP、LCP、CLS等)
  • 提到现代框架的SSR、CSR等渲染方式