输入url后发生了什么——PerformanceTiming

输入url后发生了什么,总体流程如下:

  1. 安全检查、访问限制:浏览器检查是否可以上网、经过网关|代理服务器|防火墙
  2. 浏览器缓存判断:强制缓存
  3. DNS解析
  4. TCP连接:三次握手
  5. 处理请求
  6. 渲染页面

这一系列过程,其实我们可以通过 PerformanceTiming 来看看具体发生了什么。

PerformanceTiming 是一个性能检测的api,它包含了当前页面中与时间相关的信息,它是一个w3c的提案,它检测浏览器输入url后,从卸载页面到新页面生成的各个流程。

详细见下图:

image

各个阶段的作用:

  1. Prompt for unload:浏览器准备卸载页面
  2. Redirect:导航栏跳转页面,缓存判断在这里进行
  3. App Cache:浏览器本地缓存处理
  4. DNS:dns解析、dns缓存,第一次比较慢,后面比较快
  5. TCP:http层面的握手、https层面的握手
  6. Request:http开始工作,发送请求。注意这里没有requestEnd,因为浏览器不知道啥时候传输结束
  7. unload:卸载页面
  8. response:接受请求结果。
  9. processing:dom字符串 -> dom树
  10. onload:触发onload事件

相关事件的含义:

  • navigationStart:当前浏览器窗口的前一个网页关闭,发生unload事件时的Unix毫秒时间戳。如果没有前一个网页,则等于fetchStart属性。
  • unloadEventStart:如果前一个网页与当前网页属于同一个域名,则返回前一个网页的unload事件发生时的Unix毫秒时间戳。如果没有前一个网页,或者之前的网页跳转不是在同一个域名内,则返回值为0。
  • unloadEventEnd:如果前一个网页与当前网页属于同一个域名,则返回前一个网页unload事件的回调函数结束时的Unix毫秒时间戳。如果没有前一个网页,或者之前的网页跳转不是在同一个域名内,则返回值为0。
  • redirectStart:返回第一个HTTP跳转开始时的Unix毫秒时间戳。如果没有跳转,或者不是同一个域名内部的跳转,则返回值为0。
  • redirectEnd:返回最后一个HTTP跳转结束时(即跳转回应的最后一个字节接受完成时)的Unix毫秒时间戳。如果没有跳转,或者不是同一个域名内部的跳转,则返回值为0。
  • fetchStart:返回浏览器准备使用HTTP请求读取文档时的Unix毫秒时间戳。该事件在网页查询本地缓存之前发生。
  • domainLookupStart:返回域名查询开始时的Unix毫秒时间戳。如果使用持久连接,或者信息是从本地缓存获取的,则返回值等同于fetchStart属性的值。
  • domainLookupEnd:返回域名查询结束时的Unix毫秒时间戳。如果使用持久连接,或者信息是从本地缓存获取的,则返回值等同于fetchStart属性的值。
  • connectStart:返回HTTP请求开始向服务器发送时的Unix毫秒时间戳。如果使用持久连接(persistent connection),则返回值等同于fetchStart属性的值。
  • connectEnd:返回浏览器与服务器之间的连接建立时的Unix毫秒时间戳。如果建立的是持久连接,则返回值等同于fetchStart属性的值。连接建立指的是所有握手和认证过程全部结束。
  • secureConnectionStart:返回浏览器与服务器开始安全链接的握手时的Unix毫秒时间戳。如果当前网页不要求安全连接,则返回0。
  • requestStart:返回浏览器向服务器发出HTTP请求时(或开始读取本地缓存时)的Unix毫秒时间戳。
  • responseStart:返回浏览器从服务器收到(或从本地缓存读取)第一个字节时的Unix毫秒时间戳。
  • responseEnd:返回浏览器从服务器收到(或从本地缓存读取)最后一个字节时(如果在此之前HTTP连接已经关闭,则返回关闭时)的Unix毫秒时间戳。
  • domLoading:返回当前网页DOM结构开始解析时(即Document.readyState属性变为“loading”、相应的readystatechange事件触发时)的Unix毫秒时间戳。
  • domInteractive:返回当前网页DOM结构结束解析、开始加载内嵌资源时(即Document.readyState属性变为“interactive”、相应的readystatechange事件触发时)的Unix毫秒时间戳。
  • domContentLoadedEventStart:返回当前网页DOMContentLoaded事件发生时(即DOM结构解析完毕、所有脚本开始运行时)的Unix毫秒时间戳。
  • domContentLoadedEventEnd:返回当前网页所有需要执行的脚本执行完成时的Unix毫秒时间戳。
  • domComplete:返回当前网页DOM结构生成时(即Document.readyState属性变为“complete”,以及相应的readystatechange事件发生时)的Unix毫秒时间戳。
  • loadEventStart:返回当前网页load事件的回调函数开始时的Unix毫秒时间戳。如果该事件还没有发生,返回0。
  • loadEventEnd:返回当前网页load事件的回调函数运行结束时的Unix毫秒时间戳。如果该事件还没有发生,返回0。

performance.timing 是个很强大的api,可以用来做性能监控

例如:

1
2
3
4
5
6
7
8
9
var t = performance.timing;
//页面加载的耗时
var pageloadtime = t.loadEventStart - t.navigationStart;
//域名解析的耗时
var dns = t.domainLookupEnd - t.domainLookupStart;
//TCP连接的耗时
var tcp = t.connectEnd - t.connectStart;
//读取页面第一个字节之前的耗时
var ttfb = t.responseStart - t.navigationStart;

DOMContentLoaded、load 区别

DOMContentLoaded 是初始的 HTML 文档被完全加载和解析完成之后,DOMContentLoaded 事件被触发,而无需等待样式表、图像和子框架的完成加载。

load是监控整个文档(包括资源)是否加载完毕,所有资源加载完毕后触发