页面性能始终是 Web 开发者关心的话题。

Performance 接口通过 JavaScript API 暴露了浏览器内部 的度量指标,允许开发者直接访问这些信息并基于这些信息实现自己想要的功能。

这个接口暴露在 window.performance 对象上。

所有与页面相关的指标,包括已经定义和将来会定义的,都会存在于 这个对象上。

客户端延迟 API

Performance Timeline API 使用一套用于度量客户端延迟的工具扩展了 Performance 接口。

性能度 量将会采用计算结束与开始时间差的形式。

这些开始和结束时间会被记录为 DOMHighResTimeStamp 值,而封装这个时间戳的对象是 PerformanceEntry 的实例。

浏览器会自动记录各种 PerformanceEntry 对象,而使用 performance.mark()也可以记录自定 义的 PerformanceEntry 对象。

1、记录时间点 performance.mark

  1. performance.mark('自定义记录的名字');

以上代码,会在客户端从0开始运行时开始记录开始时间,运行到mark这段代码后记录结束时间,结束时间 - 开始时间 = 页面加载用时。
单位:毫秒

2、获取性能数据 performance.getEntriesByType

标记后的性能指标,会放在一个数组里,通过performance.getEntriesByType(‘mark’) 获取记录的信息。

  1. // 1、记录时间点
  2. performance.mark('start');
  3. setTimeout(() => {
  4. performance.mark('end');
  5. // 2、输出记录的性能指标
  6. console.log(performance.getEntriesByType('mark')[0]);
  7. console.log(performance.getEntriesByType('mark')[1]);
  8. }, 1000)

image.png

导航时间 API

Navigation Timing API 提供了高精度时间戳,用于度量当前页面加载速度。

浏览器会在导航事件发

生时自动记录 PerformanceNavigationTiming 条目。这个对象会捕获大量时间戳,用于描述页面是 何时以及如何加载的。

image.png

页面加载说明

  1. const [performanceNavigationTimingEntry] = performance.getEntriesByType('navigation');
  2. console.log(performanceNavigationTimingEntry);
  3. /*
  4. PerformanceNavigationTiming {
  5. 1、重定向
  6. // 第一个HTTP重定向开始时的时间戳。如果没有重定向,或者重定向中的一个不同源,这个值会返回0。
  7. redirectStart: 0
  8. // 最后一个HTTP重定向完成时(也就是说是HTTP响应的最后一个比特直接被收到的时间)的时间戳。
  9. // 如果没有重定向,或者重定向中的一个不同源,这个值会返回0.
  10. redirectEnd: 0
  11. // 如果有重定向的话,页面通过几次重定向跳转而来,默认为0
  12. redirectCount: 0
  13. 2、缓存
  14. // 浏览器准备好使用HTTP请求来获取(fetch)文档的时间戳。这个时间点会在检查任何应用缓存之前。
  15. fetchStart: 0.2750000003288733
  16. 3、DNS解析
  17. domainLookupStart: 0.2750000003288733 // 解析开始
  18. domainLookupEnd: 0.2750000003288733 //解析结束
  19. 4、HTTP(TCP)建立连接
  20. // 建立开始时间
  21. connectStart: 0.2750000003288733
  22. // HTTPS 返回浏览器与服务器开始安全链接的握手时的时间戳。如果当前网页不要求安全连接,则返回0
  23. secureConnectionStart: 0
  24. // 建立结束时间
  25. connectEnd: 0.2750000003288733
  26. 5、发送网页资源请求
  27. // 向服务器发出HTTP请求时(或开始读取本地缓存时)的时间戳
  28. requestStart: 0.2750000003288733
  29. // 返回浏览器从服务器收到(或从本地缓存读取)第一个字节时的时间戳。
  30. //如果传输层在开始请求之后失败并且连接被重开,该属性将会被数制成新的请求的相对应的发起时间。
  31. responseStart: 0.2750000003288733
  32. // 返回浏览器从服务器收到(或从本地缓存读取,或从本地资源读取)最后一个字节时
  33. //(如果在此之前HTTP连接已经关闭,则返回关闭时)的时间戳。
  34. responseEnd: 1.905000000988366
  35. 6、加载DOM
  36. // 当前网页DOM结构结束解析、开始加载内嵌资源时(即Document.readyState属性变为“interactive”、相应的readystatechange事件触发时)的时间戳。
  37. domInteractive: 10.28500000029453
  38. // 当解析器发送DOMContentLoaded 事件,即所有需要被执行的脚本已经被解析时的时间戳。
  39. domContentLoadedEventStart: 10.340000000724103
  40. // 当所有需要立即执行的脚本已经被执行(不论执行顺序)时的时间戳。
  41. domContentLoadedEventEnd: 10.345000000597793
  42. // 当前文档解析完成,即Document.readyState 变为 'complete'且相对应的readystatechange 被触发时的时间戳
  43. domComplete: 10.725000000093132
  44. 7、load事件
  45. // load事件被发送时的时间戳。如果这个事件还未被发送,它的值将会是0。
  46. loadEventStart: 10.74500000140688
  47. // 当load事件结束,即加载事件完成时的时间戳。如果这个事件还未被发送,或者尚未完成,它的值将会是0.
  48. loadEventEnd: 10.750000001280569
  49. 其他
  50. decodedBodySize: 0
  51. duration: 10.750000001280569
  52. encodedBodySize: 0
  53. entryType: "navigation"
  54. initiatorType: "navigation"
  55. name: ""
  56. nextHopProtocol: ""
  57. serverTiming: []
  58. startTime: 0
  59. transferSize: 0
  60. type: "reload"
  61. unloadEventEnd: 0
  62. unloadEventStart: 0
  63. workerStart: 0
  64. }
  65. */