# 前端性能优化篇
# 一、前言
⚡ 30 秒速记
- 性能优化先拆链路:
DNS解析 →TCP/TLS连接 →HTTP传输 → 浏览器渲染 → 主线程交互 - 指标要对应用户体验:
LCP看主内容呈现,INP看交互响应,CLS看布局稳定 - 定位顺序是“现象 → 指标 →
trace证据 → 瓶颈”,不能凭经验直接上优化清单 - 实验室工具便于复现,但上线后还要用
RUM按设备、网络、地域和页面分位数验证 - 性能与成本、正确性、可维护性相互制约,必须设基线、预算和回归门禁
前端性能优化要沿着页面加载链路定位,从 DNS、TCP、HTTP 一直看到浏览器解析和渲染。 网络阶段可以减少解析与连接成本,并通过压缩、合并资源和 CDN 缩短请求时间。浏览器阶段更关注资源加载、缓存、服务端渲染以及回流、重绘和不必要的 DOM 操作。实际处理时要先确认慢在哪一段,因为有些问题需要服务端配合,前端单独调整并不能解决。
# 知识体系: 从一道面试题说起
在展开性能优化的话题之前,我想先抛出一个老生常谈的面试问题:
从输入 URL 到页面加载完成,发生了什么?
- 这个问题非常重要,因为我们后续的内容都将以这个问题的答案为骨架展开。我希望正在阅读这本小册的各位可以在心里琢磨一下这个问题——无须你调动太多计算机的专业知识,只需要你用最快的速度在脑海中架构起这个抽象的过程——我们接下来所有的工作,就是围绕这个过程来做文章。
- 我们现在站在性能优化的角度,一起简单地复习一遍这个经典的过程:首先我们需要通过 DNS(域名解析系统)将 URL 解析为对应的 IP 地址,然后与这个 IP 地址确定的那台服务器建立起 TCP 网络连接,随后我们向服务端抛出我们的 HTTP 请求,服务端处理完我们的请求之后,把目标数据放在 HTTP 响应里返回给客户端,拿到响应数据的浏览器就可以开始走一个渲染的流程。渲染完毕,页面便呈现给了用户,并时刻等待响应用户的操作(如下图所示)。

我们将这个过程切分为如下的过程片段:
DNS解析TCP连接HTTP请求抛出- 服务端处理请求,
HTTP响应返回 - 浏览器拿到响应数据,解析响应内容,把解析的结果展示给用户
大家谨记,我们任何一个用户端的产品,都需要把这 5 个过程滴水不漏地考虑到自己的性能优化方案内、反复权衡,从而打磨出用户满意的速度。
# 从原理到实践:各个击破
- 我们接下来要做的事情,就是针对这五个过程进行分解,各个提问,各个击破。
具体来说,DNS 解析花时间,能不能尽量减少解析次数或者把解析前置?能——浏览器 DNS 缓存和 DNS prefetch。TCP 每次的三次握手都急死人,有没有解决方案?有——长连接、预连接、接入 SPDY 协议。如果说这两个过程的优化往往需要我们和团队的服务端工程师协作完成,前端单方面可以做的努力有限,那么 HTTP 请求呢?——在减少请求次数和减小请求体积方面,我们应该是专家!再者,服务器越远,一次请求就越慢,那部署时就把静态资源放在离我们更近的 CDN 上是不是就能更快一些?