那个关于 100 毫秒的问题

当一个小网站显得迟缓时,如何区分服务器工作、网络等待和浏览器渲染。

发布于
2026年6月28日
更新于
2026年8月2日
阅读进度
2 分钟
标签
performance, web, engineering
Read the English version

“慢”不是诊断结果

页面感觉很慢时,第一个有用的问题不是“哪个框架该负责”,而是:时间究竟花在了哪里? 一次请求会跨过多个边界,每个边界需要不同的测量方法。

阶段 常见工作 值得观察的信号
边缘节点 路由与缓存查找 缓存状态、Age 和节点区域
服务器 获取数据并生成 HTML 首字节时间
网络 建立连接与传输 协议和载荷大小
浏览器 解析、样式、布局和绘制 Navigation Timing 与视觉稳定性

从一个小测量开始

const navigation = performance.getEntriesByType(
  'navigation',
)[0] as PerformanceNavigationTiming

const serverWait = navigation.responseStart - navigation.requestStart
const download = navigation.responseEnd - navigation.responseStart
const interactivePath =
  navigation.domContentLoadedEventEnd - navigation.startTime

console.table({ serverWait, download, interactivePath })

这些数字只是线索。至少运行几次,保持路由不变,并记录每次响应是否命中缓存。

推荐的排查顺序

  1. 确认服务器返回的 HTML 已经包含有意义的内容。
  2. 记录一次冷请求和至少三次热请求。
  3. 从响应头检查缓存身份、新鲜度和节点。
  4. 比较 HTML、最大样式表和脚本大小。
  5. 测试真实文章页,而不只是首页。
  6. 在窄屏和较慢网络下再测一次。 常见的有效改进并不复杂:
  • 把已经验证过的公开内容缓存到读者附近。
  • 为上游 API 设置明确超时。
  • 不为完全静态的组件发送多余客户端代码。
  • 为图片预留尺寸,避免布局跳动。
  • 每次只改一件事,并记录前后结果。 MDN 对 PerformanceNavigationTiming 有完整说明。真正重要的习惯,是让每个数字都对应一个具体系统边界。

“100 毫秒”究竟代表什么?

它不是所有网站必须完成的指标,而是一个问题:为了让这个 URL 如此迅速、同时仍然返回正确且足够新鲜的内容,系统需要满足什么条件?

Bojin Li

写软件、系统,以及那些还没定型的部分。