我把首屏从 4s 优化到 800ms,—直到我打开了 Network 面板的「第三栏」

1 阅读12分钟

这是我做前端第 6 年学到最反直觉的一件事:首屏指标好看,不等于用户体验好。

那一周我加班到崩溃。Lighthouse 分数从 47 干到 92,LCP 从 4.2s 砍到 0.8s,老板说"漂亮",但客服反馈仍然源源不断:"网站打不开""一直转圈""你们是不是炸了"。

直到我把 Chrome DevTools 那个几乎没人看过的面板打开——我才看清楚自己白干了一周。


一、你打开 Network 面板,到底在看什么?

掘金上 90% 的性能优化文章都会教你看 Network 面板。但绝大多数人看 Network,眼睛只会盯着两个东西:

  1. 请求列表——哪个文件最大、哪个加载最慢
  2. Waterfall 那条彩色横条——大概看个整体瀑布

然后呢?然后就没了。

但凡是性能优化做久了的同学,应该都遇到过这种诡异的场景:

  • Bundle 已经压到极致,Tree-shaking 该剪的全剪了
  • 图片该懒加载的懒加载、该转 WebP 的转 WebP
  • CDN 接了、Service Worker 缓存了、HTTP/2 也开了
  • Lighthouse 跑出来一片绿
  • 但是用户依然在骂慢

如果你正在经历这个阶段,先别急着怀疑人生。问题不在你优化的部分,问题在你根本没看到的那一层


二、那个被忽略的「第三栏」:Request Timing

打开 Chrome DevTools → Network → 随便点一个请求 → 切到 Timing 标签。

你会看到一段彩虹一样的瀑布图,依次显示这些阶段:

Queueing            ← 浏览器排队
Stalled             ← 等待时间(连接池、代理协商等)
DNS Lookup          ← DNS 解析
Initial connection  ← TCP 握手
SSL                 ← TLS 握手
Request sent        ← 发送请求
Waiting (TTFB)      ← 等服务器返回第一个字节 ★ 重点
Content Download    ← 下载响应内容

这八段,绝大多数前端只关心最后两段——Waiting 和 Content Download。

但真相是:前面那五段加起来的时间,经常比你优化的所有前端代码加起来还多。


三、我的"惨案":5 段时间里有 4 段在挨打

回到开头说的那个项目。我把所有前端能优化的都优化了,但用户还是说慢。后来我从西部用户的电脑上远程抓了一份 Network 截图,打开 Timing 一看,瞬间清醒:

Queueing            2ms
Stalled             1ms
DNS Lookup          480ms   ← ???
Initial connection  320ms   ← ???
SSL                 680ms   ← ???!
Request sent        1ms
Waiting (TTFB)      1240ms  ← ???!!
Content Download    180ms
──────────────────────────
总计                2904ms

前端能控制的部分(Content Download)只有 180ms。其他 2700ms 全部是网络层和服务器响应层在挨打。

我那一周做的所有前端优化,加起来省下来的时间,还没有 DNS 解析慢的那 480ms 多

那一刻我意识到一件事:作为前端,如果你不懂网络层和后端响应层,你的性能优化就是在沙地上盖楼。

下面挨个讲这五段「被忽略的瓶颈」分别意味着什么、怎么排查、怎么甩锅给该背锅的人。(开玩笑,是怎么协同解决。)


四、DNS Lookup 慢:用户连「找到你」这步都没走完

这一段在干嘛?

浏览器把你的域名(比如 api.yourcompany.com)翻译成 IP 地址。

多少算慢?

  • 优秀:< 20ms
  • 正常:20~80ms
  • 异常:> 100ms
  • 灾难:> 300ms

为什么会慢?

  1. 权威 DNS 服务商性能差:用了便宜或者偏门的 DNS 解析服务
  2. CNAME 链太长:很多人接 CDN 之后会有 3~4 层 CNAME 嵌套,每一层都要解析一次
  3. DNS 被污染或劫持:某些地区的运营商 DNS 服务器把你的域名解析到错误的 IP
  4. TTL 设置不合理:设得太短,浏览器一直重复解析;设得太长,切流的时候用户还在用旧 IP

怎么验证?

你自己电脑上 dig 一下永远是对的,因为公司网用的可能是 8.8.8.8 或者阿里 DNS。要看用户视角,得用 多地 DNS 查询 这类工具,让全国电信/联通/移动节点同时帮你解析一次,对比 IP 是否一致、解析耗时多少。如果某些地区返回的 IP 完全不对,那就是被污染了。

前端能做什么?

技术层面有限,但能做的:

  • <link rel="dns-prefetch" href="//api.example.com"> 提前预解析关键域名
  • <link rel="preconnect" href="https://api.example.com"> 提前建立连接
  • 域名收敛:把分散在多个域名的资源合并到一两个域名上,避免反复 DNS 查询

但更根本的解决,是推动运维去:

  • 换性能更好的权威 DNS 服务商
  • 减少 CNAME 嵌套层级
  • 设置合理的 TTL(一般 5~10 分钟)

五、Initial Connection 慢:TCP 握手就吃掉了你 300ms

这一段在干嘛?

跟服务器完成 TCP 三次握手,建立可靠连接。

多少算慢?

这段时间基本等于 1 个 RTT(往返时延)。所以:

  • 同城用户:< 30ms
  • 跨省用户:30~80ms
  • 跨境用户:100~300ms+
  • 跨洲用户:200~500ms+

为什么慢?

这一段的"慢"基本不是 bug,而是物理规律。 光速是不可突破的:

  • 北京 ↔ 上海,理论延迟 ~7ms,实际 ~20ms
  • 北京 ↔ 洛杉矶,理论延迟 ~67ms,实际 ~180ms
  • 上海 ↔ 法兰克福,理论延迟 ~49ms,实际 ~250ms

如果你看到 TCP 握手时间异常高(比如同城用户也要 200ms),那大概率是:

  • 服务器入口拥塞(Nginx worker 不够、accept queue 满了)
  • 中间链路丢包重传
  • 用户网络本身有问题

怎么验证?

光看自己机器没用,要用 多地持续 Ping 跑几分钟,看不同地区到你服务器的延迟、丢包、抖动。如果发现某个地区丢包率超过 1%、或者抖动剧烈,就要用 路由追踪 看到底是中间哪一跳出了问题——很多时候是某省骨干网拥塞,不是你服务器的锅。

前端能做什么?

  • HTTP Keep-Alive 复用连接:让多个请求复用同一个 TCP 连接,省下后续握手
  • HTTP/2 多路复用:一个连接发多个请求,效果更好
  • 域名收敛:避免给每个不同域名都建立独立连接

真正解决问题的方法

CDN。 让用户连接的是离他最近的 CDN 节点(可能就 10ms 距离),而不是你那台在华东的源站(可能 200ms 距离)。

这就是为什么所有讲性能优化的文章都在喊"上 CDN"——它本质上解决的不是带宽问题,是物理距离问题


六、SSL 握手慢:HTTPS 的隐藏成本,跨境场景的头号杀手

这一段在干嘛?

完成 TLS 加密协商,建立安全通道。

多少算慢?

  • 优秀:< 100ms
  • 正常:100~300ms
  • 异常:> 500ms

为什么会慢?

这一段是最容易被前端忽略、但成本最高的环节之一。原因:

  1. TLS 1.2 需要 2 个 RTT,TLS 1.3 只要 1 个 RTT

    • 跨境场景下 RTT 是 200ms,1.2 比 1.3 多 200ms+
    • 你猜全国还有多少服务器没升级到 TLS 1.3?
  2. 证书链太长:每多一级中间证书,就多一次验证开销

  3. 没启用 OCSP Stapling:客户端要去 CA 服务器查证书吊销状态——这一步如果跨境,能轻松多 200ms

  4. 没启用 Session Resumption:每次新连接都要完整重新握手

  5. 加密套件太老:用了非现代椭圆曲线,计算慢

前端能做什么?

技术层面能做的不多。但你可以拿着这份清单去找运维:

[ ] 启用 TLS 1.3
[ ] 证书链精简到 2[ ] 启用 OCSP Stapling
[ ] 启用 Session Resumption / Session Tickets
[ ] 使用 ECDSA 证书替代 RSA(更小更快)
[ ] 启用 0-RTT(仅适合非敏感场景)

我之前优化过一个 SaaS 项目的登录页,单纯调整 TLS 配置(升级到 1.3 + OCSP Stapling + ECDSA),TLS 握手从 580ms 降到 90ms。用户感知的"打开变快了",比我之前优化 Bundle 体积一周的效果还明显。


七、Waiting (TTFB):服务器到底在等什么?

这一段在干嘛?

请求已经发出去了,客户端在等服务器返回第一个字节

这是后端的舞台。

多少算慢?

  • 优秀:< 100ms
  • 正常:100~300ms
  • 异常:> 500ms
  • 灾难:> 1s

Google 的标准是 800ms 以内,但实际产品里我们应该追求 200ms 以内。

为什么慢?

TTFB 高的可能性非常多:

  1. 慢 SQL:80% 的接口慢都跟数据库有关
  2. N+1 查询:典型反模式,列表页拉 20 个详情就是 21 次查询
  3. 缓存未命中或缓存穿透
  4. 同步调用了慢的下游服务:远程 API、第三方接口、消息队列
  5. 冷启动:Serverless 场景的冷启动可以轻松 1s+
  6. CDN 回源:CDN 没命中,要回到远在天边的源站
  7. 跨区域调用:服务部署在华东,调了个华南的下游
  8. 应用初始化慢:JVM 启动、依赖注入、配置加载

怎么验证?

TTFB 这个指标,光看自己电脑的 DevTools 数据用处不大——你在公司千兆网里看到 TTFB 80ms,新疆用户可能看到的是 1.5s。要拿到真实用户视角,可以用 多地网站测速 从全国节点同时测,把 DNS / TCP / TLS / TTFB / 下载 每一段的耗时拆开看,能立刻看出是后端慢、CDN 回源慢、还是某地区链路出了问题。

前端能做什么?

虽然 TTFB 主要是后端的事,但前端的一些做法可以让用户感知变好:

  • 骨架屏 / Skeleton Screen:让用户感觉"在加载"而不是"挂了"
  • 预请求 / 数据预取:用户大概率会去的页面,提前发请求
  • Service Worker 缓存:让用户重复访问时不用等 TTFB
  • 乐观更新(Optimistic UI) :先假设请求会成功,UI 立刻响应

排查时的关键技巧

让后端给你看 APM 链路追踪。如果他们说"没接 APM",建议你跑路(开玩笑),但接 APM 是排查 TTFB 的前提,没有数据光靠猜是优化不了的。


八、把这套放进真实项目:我后来怎么干的?

接着开头那个 case 讲完。

我把那张瀑布图截图发到群里,跟运维和后端说:"各位,前端能优化的部分只剩 180ms 了,剩下 2700ms 在你们手里。"

群里安静了 30 秒。然后:

运维干了三件事

  1. 换了权威 DNS 服务商 → DNS 解析从 480ms 降到 60ms
  2. 升级 TLS 1.3 + OCSP Stapling + ECDSA 证书 → SSL 握手从 680ms 降到 110ms
  3. 在西部 / 北部各加了一组 CDN 节点 → TCP 握手从 320ms 降到 50ms

后端干了两件事

  1. 给商品详情页接口加了 Redis 缓存 → TTFB 从 1240ms 降到 220ms
  2. 把同步调用的推荐接口改成异步 → TTFB 再降 80ms

最终结果

原来:2904ms
现在:660ms

降幅 77%。前端代码一行没改。

那一周我用血泪学到的事——性能优化的天花板,从来不在前端代码本身


九、怎么把 Network 面板这一栏的价值用满?

总结一下这篇文章想说的几件事:

1. 别只看 Waterfall,要看每个请求的 Timing 详情

打开 Chrome DevTools → Network → 点任意请求 → Timing 标签。把上面 8 段时间挨个看一遍。

2. 知道每一段慢,对应的"该背锅的人"

阶段慢的话谁来背
DNS Lookup运维 + 域名/DNS 服务商
Initial connection网络 / CDN
SSL运维(TLS 配置)
Waiting (TTFB)后端 + DB + 缓存
Content Download前端(资源体积)

前端真正能 100% 掌控的只有最后一段。

3. 测速一定要从用户视角

你自己电脑在公司 Wi-Fi 看到的 Timing 数据毫无参考价值。要从用户所在的地区、运营商、网络环境去看。

工程上的做法:

  • 接入 RUM(Real User Monitoring)工具,比如 Sentry、SkyWalking、阿里 ARMS
  • 关键页面在 window.performance.timing 里拿到这些数据上报
  • 按用户地区、运营商、设备分组统计

如果项目还在早期,没接 RUM 但又想看用户视角,可以用 BiuPing 这类聚合多地节点的免费在线工具——支持全国电信/联通/移动 + 海外节点同时发起 Ping / TCPing / 路由追踪 / 网站测速,能在没接监控系统的情况下快速验证用户视角的真实数据。

4. 跟后端和运维"翻译"问题

把 Timing 截图发出来,比说一万句"用户说慢"管用。让数据替你说话。


十、写在最后

做前端做久了,特别容易陷入一种"前端宇宙观"——以为所有的性能问题都能在前端代码里解决。

但事实是:一个用户从输入网址到看到页面,前端代码控制的部分可能只占 20%。剩下 80% 在 DNS、网络链路、TLS 握手、服务器响应里。

如果你能看懂 Network 面板里那 8 段时间,并且知道每一段慢该找谁,你就已经超过了 90% 的前端同行。

下次再有用户骂"网站慢",先别急着改代码。打开 Network 面板,截一张 Timing 图,再决定下一步。


如果这篇文章对你有启发,欢迎点赞收藏。也欢迎评论区交流你踩过的"前端优化白干"的坑——这种事,听一个真实案例胜过看一万篇博客 🚀