← 返回题目列表

Navigation Timing 和 Resource Timing 能分析哪些性能问题?

中等 第 21 / 30 题 更新于 2026/07/29
浏览器Performance API性能分析Timing

简化版

Navigation Timing 用来分析页面导航加载各阶段耗时,如 DNS、TCP、TLS、请求、响应、DOM 解析;Resource Timing 用来分析单个资源加载耗时。它们能帮助定位慢在网络连接、服务端响应、资源下载还是前端解析执行。

详细版

常见指标:

  • DNS 查询耗时。
  • TCP/TLS 连接耗时。
  • TTFB 服务端首字节时间。
  • HTML 下载时间。
  • DOMContentLoaded 和 load 时间。
  • JS、CSS、图片等资源耗时。

使用方式:

  • performance.getEntriesByType('navigation') 获取页面导航。
  • performance.getEntriesByType('resource') 获取资源。
  • 上报关键字段到监控系统。
  • 结合接口 traceId 和用户环境分析。

注意:Timing API 是诊断工具,不是单独优化方案。

完整版教学

一、性能优化先要知道慢在哪

用户说“页面慢”很模糊。慢可能发生在 DNS、建连、TLS、服务端处理、HTML 下载、JS 阻塞、图片加载、渲染等任何阶段。Navigation Timing 和 Resource Timing 的价值就是把加载过程拆成可量化阶段。

没有这些数据,优化容易变成猜谜:有人压缩 JS,有人加缓存,但真正问题可能是接口 TTFB 过高或第三方字体阻塞。

导航开始 → DNS → TCP/TLS → 请求 → TTFB → 响应下载 → DOM 解析 → load

二、Navigation Timing 看主文档加载

Navigation Timing 记录一次页面导航的关键时间点。现代浏览器用 PerformanceNavigationTiming entry 表示。可以从中计算 DNS、连接、请求响应、DOM 事件等耗时。

const nav = performance.getEntriesByType('navigation')[0]
const dns = nav.domainLookupEnd - nav.domainLookupStart
const tcp = nav.connectEnd - nav.connectStart
const ttfb = nav.responseStart - nav.requestStart
const download = nav.responseEnd - nav.responseStart

这些字段能告诉你 HTML 主文档慢在哪里。比如 DNS 200ms 说明域名解析慢,TTFB 1500ms 更可能是服务端或网络链路问题。

三、Resource Timing 看资源瀑布

Resource Timing 记录 JS、CSS、图片、字体、接口等资源加载信息。它能找出大资源、慢 CDN、重复下载、阻塞首屏的字体或图片。配合 Network 面板和 RUM 上报,可以分析真实用户环境。

问题Timing 表现可能优化
DNS 慢domainLookup 耗时高dns-prefetch/preconnect
服务端慢TTFB 高后端优化/缓存
资源太大response 下载久压缩/分包
连接慢connect 耗时高CDN/连接复用

Resource Timing 默认对跨域资源可能有字段限制,服务端需要设置 Timing-Allow-Origin 才能暴露完整数据。

四、用数字拆解比单看 load 更有用

load 时间只能表示所有传统资源加载完成,不能说明用户何时看到内容,也不能说明慢在哪。真实优化要拆阶段。

数字例子:页面 load 4000ms,其中 TTFB 1800ms、JS 下载 800ms、图片 1000ms。此时只压缩 CSS 可能收益很小;应优先处理 TTFB、JS 分包和图片策略。相反,如果 TTFB 100ms,但 JS 执行长任务 1500ms,Timing 还要结合 Long Tasks 和性能面板继续查 CPU。

五、采集要结合真实用户环境

实验室 Lighthouse 很有用,但真实用户设备、网络、地区、浏览器差异很大。RUM 采集 Timing 数据能看到线上真实分布,例如 P50、P90、P95。不要只看平均值,平均值会被极端值干扰。

例如 1000 个用户中,900 人 1 秒打开,100 人 10 秒打开,平均是 1.9 秒,看起来还行;但 P90/P95 会暴露尾部体验很差。性能监控更应关注分位数。

P50:一半用户低于这个耗时
P90:90% 用户低于这个耗时
P95:尾部慢用户体验

六、Timing 数据要注意边界

Timing API 不等于完整性能真相。它能看网络加载阶段,但 JS 执行、渲染阻塞、交互延迟还需要 Long Tasks、Paint Timing、Event Timing、PerformanceObserver 等配合。跨域资源没有 TAO 头时,详细字段也可能不可见。

因此面试回答要说“用 Timing 定位加载链路,再结合其他指标定位渲染和交互”。这比把它当万能性能 API 更准确。

记忆钩子:Navigation Timing 看主路,Resource Timing 看每辆车;慢在哪一段,数据会先告诉你。

七、常见误区与追问

  • 误区:load 时间就是用户体验。 load 不等于首屏、可交互或流畅度,还要看 LCP、INP、Long Tasks 等。
  • 误区:Timing API 能解释所有卡顿。 它偏加载链路,CPU 执行和渲染问题要结合其他 API。
  • 误区:跨域资源一定能拿到完整 timing。 需要资源服务端设置 Timing-Allow-Origin。
  • 追问:TTFB 高说明什么? 可能是服务端处理慢、网络链路慢、缓存未命中或后端排队。
  • 追问:如何定位大图片拖慢首屏? 用 Resource Timing 找图片下载耗时、大小和开始时间,再看是否影响 LCP。
  • 追问:为什么看 P95 不只看平均值? 平均值掩盖尾部慢用户,P95 更能反映差体验。

八、加强记忆

Timing API 用“拆链路、看资源、看分位、知边界”来记。Navigation Timing 拆主文档,Resource Timing 拆资源瀑布,RUM 上报看真实用户分布;加载问题靠它定位,CPU 和交互问题还要配合 Long Tasks、Paint 和 Event Timing。