从输入 URL 到页面展示发生了什么?

完整流程

1. URL 解析
2. DNS 查询
3. TCP 连接(三次握手)
4. TLS 握手(HTTPS)
5. 发送 HTTP 请求
6. 服务器处理请求并返回响应
7. 浏览器接收响应
8. 浏览器渲染
9. 加载执行 JS/CSS
10. 触发 load 事件

1. URL 解析

https://www.example.com:443/path?query=1#hash
  │         │           │    │       │     │
  协议       域名         端口  路径    查询   锚点

2. DNS 查询

浏览器 DNS 缓存 → 操作系统 DNS 缓存 → 路由器 DNS → ISP DNS → 根域名服务器

3. TCP 三次握手

Client → SYN → Server
Client ← SYN+ACK ← Server
Client → ACK → Server
(连接建立)

4. 浏览器渲染流程

HTML → DOM 树
              → 渲染树(Render Tree)
CSS  → CSSOM 树

渲染树 → 布局(Layout/Reflow)→ 绘制(Paint)→ 合成(Composite)

详细步骤:

  1. 解析 HTML → 构建 DOM 树
  2. 解析 CSS → 构建 CSSOM 树
  3. 合并 DOM 和 CSSOM → 渲染树(不包含 display: none 的元素)
  4. 布局(Layout/Reflow) → 计算元素位置和大小
  5. 绘制(Paint) → 将渲染树转为屏幕上的像素
  6. 合成(Composite) → 将各图层合成最终画面

5. JS 执行

<!-- 阻塞 HTML 解析 -->
<script src="app.js"></script>

<!-- 不阻塞(异步下载,DOMContentLoaded 后执行 -->
<script defer src="app.js"></script>

<!-- 不阻塞(异步下载,下载完立即执行)-->
<script async src="analytics.js"></script>

6. 事件触发

DOM 解析完成 → DOMContentLoaded
图片等资源加载完成 → load

性能优化点

  1. DNS 预解析:<link rel="dns-prefetch" href="//cdn.example.com">
  2. 预连接:<link rel="preconnect" href="//cdn.example.com">
  3. 减少请求:合并文件、雪碧图
  4. 压缩:Gzip/Brotli
  5. 缓存:强缓存 + 协商缓存
  6. CDN:就近访问
  7. 懒加载:图片/组件按需加载

同分类其他题目