00000954
【web性能】Web performance 获取web各个阶段响应时间:DNS解析时间、TCP建立连接时间、首页白屏时间、dom渲染完成时间、页面onload时间等
那么我们怎么知道一个网站加载定的时间呢?
我们可以添加时间戳标记
下面的JavaScript显示了一个简单的尝试来度量完全加载页面所需的时间:
<html> <head> <title>stark wang</title> <script type="text/javascript"> var start = new Date().getTime(); function onLoad() { var now = new Date().getTime(); var latency = now - start; alert("page loading time: " + latency); } </script> </head> <body onload="onLoad()"> <!- Main page body goes from here. --> </body> </html>
上面的脚本计算在执行头部的第一个JavaScript后加载页面所需的时间,但是它并没有给出从服务器获取页面所需的时间,或者页面的初始化生命周期。
使用以下脚本得到更多信息
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>stark wang</title> </head> <script> function showNavigationDetails() { // 入口 const [entry] = performance.getEntriesByType("navigation"); // 在控制台可以看到很多参数 console.table(entry.toJSON()); } </script> <body onload="showNavigationDetails()"> </body> </html>
自己去测试
这个接口省去我们很多时间,不再需要获取时间戳了
navigationStart 加载起始时间 redirectStart 重定向开始时间(如果发生了HTTP重定向,每次重定向都和当前文档同域的话,就返回开始重定向的fetchStart的值。其他情况,则返回0) redirectEnd 重定向结束时间(如果发生了HTTP重定向,每次重定向都和当前文档同域的话,就返回最后一次重定向接受完数据的时间。其他情况则返回0) fetchStart 浏览器发起资源请求时,如果有缓存,则返回读取缓存的开始时间 domainLookupStart 查询DNS的开始时间。如果请求没有发起DNS请求,如keep-alive,缓存等,则返回fetchStart domainLookupEnd 查询DNS的结束时间。如果没有发起DNS请求,同上 connectStart 开始建立TCP请求的时间。如果请求是keep-alive,缓存等,则返回domainLookupEnd (secureConnectionStart) 如果在进行TLS或SSL,则返回握手时间 connectEnd 完成TCP链接的时间。如果是keep-alive,缓存等,同connectStart requestStart 发起请求的时间 responseStart 服务器开始响应的时间 domLoading 从图中看是开始渲染dom的时间,具体未知 domInteractive 未知 domContentLoadedEventStart 开始触发DomContentLoadedEvent事件的时间 domContentLoadedEventEnd DomContentLoadedEvent事件结束的时间 domComplete 从图中看是dom渲染完成时间,具体未知 loadEventStart 触发load的时间,如没有则返回0 loadEventEnd load事件执行完的时间,如没有则返回0 unloadEventStart unload事件触发的时间 unloadEventEnd unload事件执行完的时间
这些参数已经非常详细,也很精准,稍作处理就可以得出我们需要的一些关键数字,如:
DNS解析时间: domainLookupEnd - domainLookupStart
TCP建立连接时间: connectEnd - connectStart
白屏时间: responseStart - navigationStart
dom渲染完成时间: domContentLoadedEventEnd - navigationStart
页面onload时间: loadEventEnd - navigationStart
let timing = performance.timing, start = timing.navigationStart, dnsTime = 0, tcpTime = 0, firstPaintTime = 0, domRenderTime = 0, loadTime = 0; dnsTime = timing.domainLookupEnd - timing.domainLookupStart; tcpTime = timing.connectEnd - timing.connectStart; firstPaintTime = timing.responseStart - start; domRenderTime = timing.domContentLoadedEventEnd - start; loadTime = timing.loadEventEnd - start; console.log('DNS解析时间:', dnsTime , '\nTCP建立时间:', tcpTime, '\n首屏时间:', firstPaintTime, '\ndom渲染完成时间:', domRenderTime, '\n页面onload时间:', loadTime);