Navigation Timing收集浏览器耗时初探
什么是Navigation Timing
Navigation Timing是由w3c定义,记录浏览器与web服务通信过程中各个阶段耗时的一组时间变量。在支持JavaScript的浏览器上,使用特定的API能获取这些时间变量,从而掌握客户端与web服务之间的通信耗时,对前端优化特别是手机端有很大参考价值。
浏览器访问http所经过的路径
从浏览器点击一个链接或者打入一个网址开始,直到浏览器完整把网站内容加载出来为止,在这个过程中浏览器与互联网的交互时间都被记录在Navigation Timing这组变量上。
下图描述了这个路径和Navigation Timing对应的变量
一般访问web服务对客户端来说就有DNS、TCP、REQUEST、RESPONSE、渲染加载页面这些阶段。
由下面变量记录时间
- navigationStart:当load/unload动作被触发时,也可能是提示关闭当前文档时(即回车键在url地址栏中按下,页面被再次刷新,submit按钮被点击)。如果当前窗口中没有前一个文档,那么navigationStart的值就是fetchStart。
- redirectStart:它可能是页面重定向时的开始时间(如果存在重定向的话)或者是0。
- redirectEnd:如果存在重定向的话,redirectEnd表示最后一次重定向后服务器端response的数据被接收完毕的时间。否则的话就是0。
- fetchStart:fetchStart是指在浏览器发起任何请求之前的时间值。在fetchStart和domainLookupStart之间,浏览器会检查当前文档的缓存。
- domainLookupStart:这个属性是指当浏览器开始检查当前域名的DNS之前的那一时刻。如果因为任何原因没有去检查DNS(即浏览器使用了缓存,持久连接,或者本地资源),那么它的值等同于fetchStart。
- domainLookupEnd:指浏览器完成DNS检查时的时间。如果DNS没有被检查,那么它的值等同于fetchStart。
- connectStart:当浏览器开始于服务器连接时的时间。如果资源取自缓存(或者服务器由于其他任何原因没有建立连接,例如持久连接),那么它的值等同于domainLookupEnd。
- connectEnd:当浏览器端完成与服务器端建立连接的时刻。如果没有建立连接它的值等同于domainLookupEnd。
- secureConnectionStart:可选。如果页面使用HTTPS,它的值是安全连接握手之前的时刻。如果该属性不可用,则返回undefined。如果该属性可用,但没有使用HTTPS,则返回0。
- requestStart:指客户端发送请求到服务器的时刻。
- responseStart:指客户端收到从服务器端(或缓存、本地资源)响应回的第一个字节的数据的时刻。
- responseEnd:指客户端收到从服务器端(或缓存、本地资源)响应回的最后一个字节的数据的时刻。
- domLoading:指document对象创建完成的时刻。
- domInteractive:指文档解析完成的时刻,包括在“传统模式”下被阻塞的通过script标签加载的内容(除了使用defer或者async属性异步加载的情况)。
- domContentLoadedEventStart:当DOMContentLoaded事件触发之前,浏览器完成所有script(包括设置了defer属性但未设置async属性的script)的下载和解析之后的时刻。
- domContentLoadedEventEnd:当DOMContentLoaded事件完成之后的时刻。它也是javascript类库中DOMready事件触发的时刻。
- domComplete:如果已经没有任何延迟加载的事件(所有图片的加载)阻止load事件发生,那么该时刻将会将document.readyState属性设置为”complete”,此时刻就是domComplete。
- loadEventStart:该属性返回的是load事件刚刚发生的时刻,如果load事件还没有发生,则返回0。
- loadEventEnd:该属性返回load事件完成之后的时刻。如果load事件未发生,则返回0。
一个简单例子
下面这个简单例子可以用来测试一下Navigation Timing API,一个简单html并计算出使用的DNS、TCP、请求等时间。
1 | <html> |
参考:
使用 Navigation Timing 评估关键呈现路径
Navigation Timing Level 2
7 天打造前端性能监控系统