新公司主要的产品是一款APP,因为公司是一家电商公司,所以APP里90%以上都是Web。单从个人使用体验上看感觉挺慢了,所以就花点时间研究下Web优化。
要做性能优化,首先要有指标,W3C标准中的Performance Timing API提供的数据就可以提供性能相关的指标。
PerformanceTiming 接口是为保持向后兼容性而保留的传统接口,并且提供了在加载和使用当前页面期间发生的各种事件的性能计时信息。
如下图,Performance Timing 把浏览器中加载和解析一个HTML文件的详细过程分为 unload、redirect、App Cache、DNS、TCP、Request、Response、Processing、onload 九个阶段其中又包含了过程中的21个事件的时间。

浏览器内部阶段
网络
服务器
浏览器渲染
PerformanceTiming.navigationStart
是一个无符号 long long 型的毫秒数,表征了从同一个浏览器上下文的上一个文档卸载 (unload) 结束时的 UNIX 时间戳。如果没有上一个文档,这个值会和 PerformanceTiming.fetchStart 相同。
PerformanceTiming.unloadEventStart
是一个无符号 long long 型的毫秒数,表征了unload事件抛出时的 UNIX 时间戳。如果没有上一个文档,或则前一个文档或最后一个重定向的是一个不同源,这个值会返回 0.
PerformanceTiming.unloadEventEnd
是一个无符号 long long 型的毫秒数,表征了unload事件处理完成时的 UNIX 时间戳。如果没有上一个文档,或则前一个文档或最后一个重定向的是一个不同源,这个值会返回 0.
PerformanceTiming.redirectStart
是一个无符号 long long 型的毫秒数,表征了第一个 HTTP 重定向开始时的 UNIX 时间戳。如果没有重定向,或者重定向中的一个不同源,这个值会返回 0.
PerformanceTiming.redirectEnd
是一个无符号 long long 型的毫秒数,表征了最后一个 HTTP 重定向完成时(也就是说是 HTTP 响应的最后一个比特直接被收到的时间)的 UNIX 时间戳。如果没有重定向,或者重定向中的一个不同源,这个值会返回 0.
PerformanceTiming.fetchStart
是一个无符号 long long 型的毫秒数,表征了浏览器准备好使用 HTTP 请求来获取 (fetch) 文档的 UNIX 时间戳。这个时间点会在检查任何应用缓存之前。
PerformanceTiming.domainLookupStart
是一个无符号 long long 型的毫秒数,表征了域名查询开始的 UNIX 时间戳。如果使用了持续连接 (persistent connection),或者这个信息存储到了缓存或者本地资源上,这个值将和 PerformanceTiming.fetchStart 一致。
PerformanceTiming.domainLookupEnd
是一个无符号 long long 型的毫秒数,表征了域名查询结束的 UNIX 时间戳。如果使用了持续连接 (persistent connection),或者这个信息存储到了缓存或者本地资源上,这个值将和 PerformanceTiming.fetchStart 一致。
PerformanceTiming.connectStart
是一个无符号 long long 型的毫秒数,返回 HTTP 请求开始向服务器发送时的 Unix 毫秒时间戳。如果使用持久连接(persistent connection),则返回值等同于 fetchStart 属性的值。
PerformanceTiming.connectEnd
是一个无符号 long long 型的毫秒数,返回浏览器与服务器之间的连接建立时的 Unix 毫秒时间戳。如果建立的是持久连接,则返回值等同于 fetchStart 属性的值。连接建立指的是所有握手和认证过程全部结束。
PerformanceTiming.secureConnectionStart
是一个无符号 long long 型的毫秒数,返回浏览器与服务器开始安全链接的握手时的 Unix 毫秒时间戳。如果当前网页不要求安全连接,则返回 0。
PerformanceTiming.requestStart
是一个无符号 long long 型的毫秒数,返回浏览器向服务器发出 HTTP 请求时(或开始读取本地缓存时)的 Unix 毫秒时间戳。
PerformanceTiming.responseStart
是一个无符号 long long 型的毫秒数,返回浏览器从服务器收到(或从本地缓存读取)第一个字节时的 Unix 毫秒时间戳。如果传输层在开始请求之后失败并且连接被重开,该属性将会被数制成新的请求的相对应的发起时间。
PerformanceTiming.responseEnd
是一个无符号 long long 型的毫秒数,返回浏览器从服务器收到(或从本地缓存读取,或从本地资源读取)最后一个字节时(如果在此之前 HTTP 连接已经关闭,则返回关闭时)的 Unix 毫秒时间戳。
PerformanceTiming.domLoading
是一个无符号 long long 型的毫秒数,返回当前网页 DOM 结构开始解析时(即[Document.readyState)属性变为“loading”、相应的 readystatechange事件触发时)的 Unix 毫秒时间戳。
PerformanceTiming.domInteractive
是一个无符号 long long 型的毫秒数,返回当前网页 DOM 结构结束解析、开始加载内嵌资源时(即Document.readyState属性变为“interactive”、相应的readystatechange事件触发时)的 Unix 毫秒时间戳。
PerformanceTiming.domContentLoadedEventStart
是一个无符号 long long 型的毫秒数,返回当解析器发送DOMContentLoaded 事件,即所有需要被执行的脚本已经被解析时的 Unix 毫秒时间戳。
PerformanceTiming.domContentLoadedEventEnd
是一个无符号 long long 型的毫秒数,返回当所有需要立即执行的脚本已经被执行(不论执行顺序)时的 Unix 毫秒时间戳。
PerformanceTiming.domComplete
是一个无符号 long long 型的毫秒数,返回当前文档解析完成,即Document.readyState变为 complete且相对应的readystatechange 被触发时的 Unix 毫秒时间戳。
PerformanceTiming.loadEventStart
是一个无符号 long long 型的毫秒数,返回该文档下,load事件被发送时的 Unix 毫秒时间戳。如果这个事件还未被发送,它的值将会是 0。
PerformanceTiming.loadEventEnd
是一个无符号 long long 型的毫秒数,返回当load事件结束,即加载事件完成时的 Unix 毫秒时间戳。如果这个事件还未被发送,或者尚未完成,它的值将会是 0。
domainLookupEnd - domainLookupStartconnectEnd - connectStartresponseEnd - requestStartresponseStart - requestStartresponseEnd – fetchStartdomInteractive – fetchStartdomInteractive - responseEndloadEventStart – fetchStartdomContentLoadedEventStart - fetchStart这么多指标,到底应该关注哪些呢?如下图是 google 推荐的用户体验需要关注的指标并分了三个区间体验好、需要提升、体验差。

非著名程序员,全栈开发工程师,长期专注系统开发与架构设计。
功能待开通!