在这里插入图片描述
一般情况下,如果网页加载时间超过5s,用户就会感觉页面比较卡,用户体验相当差,用户可能会直接走人,所以加载的时间对于一个网站来说还是相当重要的。那做项目的时候怎样分析页面的加载速度慢呢?

首先我们要知道影响页面加载的因素
JS性能太差,阻塞页面
浏览器解析过程中,遇到

某个请求慢阻塞页面的加载
一般遇到页面卡顿,首先去Network里面去查看每个页面所有请求的状态及具体的加载时间,以及每一个请求的详细耗时。如果状态有非200,如pending,则去检查对应的请求。

域名下的请求数过多导致Queueing
就是浏览器与同一个域名建立的TCP连接数是有限制的,比方chrome设置的是6个,如果说同一时间,发起的同一域名的请求超过了6个,这时候就需要排队了,也就是这个Queueing时间。

HTML页面是如何完成
当我们在浏览器输入url按下Enter后,浏览器拿到你输入的url,解析出域名【 http:// domain.com 】得到域名之后进行DNS查询(TCP/IP协议中连接是需要知道IP地址),解析得到域名IP,然后与服务器建立连接,再与该IP地址来三次经典的握手建立TCP连接,如果协议头是http则与目标IP的80端口通信,如果是https则是443端口,建立好TCP连接后,就可以发送http请求了,浏览器发起请求,服务器响应并返回内容,最终就是我们所看到的页面内容。
046cf8a99135418d31a704156ac088e1.png
查看页面加载时间
以chrome为例,打开页面后,按F12或者点击右键菜单里的检查,就进入了开发者模式,开发者模式里面有很多功能,跟页面加载时间相关的就是Network标签。如下图所示:

bc8d5302c490051bb40de8f372f1ec09.png

依次是17个请求;622K数据;页面最后一个请求截止用时1.7s;DOM内容加载并解析完成用时1.48;页面所有的资源(图片,音频,视频等)加载完成用时1.58s

5368ddee584923454865217dc864aee9.png

Finish:页面最后一个请求截止的时间,如果页面加载完后,触发了ajax请求,那么该时间会加长。
DOMContentLoaded:DOM内容加载并解析完成的时间。(通俗来讲就是是页面白屏的时间)
load:页面所有的资源(图片,音频,视频等)加载完成的时间。(页面加载完成,浏览器不再转圈的时间,页面上所有的资源(图片,音频,视频等)被加载以后才会触发load事件,简单来说,页面的load事件会在DOMContentLoaded被触发之后才触发。)

一般情况下html页面在解析渲染的过程中,会有大量的请求,比如外链的css、js、图片等等,这些资源都需要浏览器去重新发起http请求。这些请求其实都是类似的一个过程。
首先我们打开F12开发都工具的Network标签,看看单个请求的各个时间段(不同的时段分别有不同的颜色区分),将鼠标悬停在waterfall字段就可以看到这个请求具体的耗时,如下图所示:

d69ecb1766b9e4b25ab60cb4bc2016a3.png

各个时间段的含义

Queueing 
请求排队的时间。就是浏览器与同一个域名建立的TCP连接数是有限制的,比方chrome设置的6个,如果说同一时间,发起的同一域名的请求超过了6个,这时候就需要排队了,也就是这个Queueing时间。 Stalled 
就是浏览器得到要发出请求的指令到请求可以发出的等待时间,一般是代理协商、以及等待可复用的TCP连接释放的时间,不包括DNS查询、建立TCP连接等时间等。 Stalled/Blocking 
请求能够被发出去前的等等时间。包含了用于处理代理的时间。另外,如果有已经建立好的连接,那么这个时间还包括等待已建立连接被复用的时间,这个遵循浏览器对同一源最大TCP连接的规则。 Proxy Negotiation 
处理代理的时间。 DNS Lookup 
DNS查询的时间,页面内任何新的域名都需要走一遍 完整的DNS查询过程,已经查询过的则走缓存。 Initial Connection / Connecting 
建立TCP连接的时间,包括TCP的三次握手和SSL的认证。 SSL 
完成ssl认证的时间 Request sent/sending 
请求第一个字节发出前到最后一个字节发出后的时间,也就是上传时间。 Waiting 
请求发出后,到收到响应的第一个字节所花费的时间。 Content Download 
收到响应的第一个字节,到接受完最后一个字节的时间,就是下载时间。

深入分析页面的性能
粗略扫一眼请求的时间,都是清一色几十毫秒。这时候我们可以在Network里瀑布般的Timeline里很直观的看出来请求的耗时情况。
在timeline里,每一条线代表一个TCP的连接,每一种颜色代表请求一个时间段,每条线的颜色一直循环变化,从灰色到深绿最后蓝色,然后又变灰色,说明浏览器建立的TCP连接一直在循环复用,这样就省去了三次握手的时间。
有一条蓝色竖线和红色竖线,蓝色竖线表示触发DomContentLoad事件触发时间,红色表示Load事件触发,如下图:

3fe480e660fb12967c93fa069cdf32e7.png

开发者工具的Performance

4899c5792be3e50b93682a235d6f77be.png

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐