这个问题要想一点一点都回答清楚我觉得非常非常难,涉及的内容之多,范围之广,我看了好多篇这个问题的文章,从一点一点懂了,到很多都不懂,再到晕头转向,再到放弃。没办法,我自己出去面试的时候也被人问过这个问题,只好把懂得一点点写下来,算是梳理一遍流程。里面有很多我觉得不错的引用文章。
参考文章:https://segmentfault.com/a/1190000007766425
https://zhuanlan.zhihu.com/p/23155051
http://frontenddev.org/link/js-css-between-the-order-of-the-relationship-with-the-performance-of-the-html-page.html
http://www.cnblogs.com/yuezk/archive/2013/01/11/2856540.html
我就不写是通过回车还是鼠标点击确定还是手机端触屏点击发送URL的了,直接就发送了。
1、输入域名之后,客户端的DNS服务器开始解析域名,解析域名之前先查找缓存中有没有解析过这个域名的IP,然后去hosts文件看有没有这个域名。没有就发起DNS服务器解析。
2、解析好之后,位于应用层的TCP协议开始连接服务器,其中有三次握手。连接成功之后IP协议开始将请求的IP地址MAC等信息做成协议包,通过传输层和网络层、链路层找到这个IP地址的服务器,查找IP地址其中又涉及很多服务器中转,因为不会一次就查找成功目标IP地址的服务器。
3、查找到目标服务器之后,服务器开始响应,以8KB的内容开始传输给客户端。
4、当浏览器接收到页面数据开始,浏览器引擎开始解析HTML,将HTML解析成DOM树,在解析的同时遇到css的link标签,开始下载css(下载同时也在解析),下载完成之后,开始解析css,将css解析成规则树(解析css的时候,也在解析HTML成DOM树),遇到<script>标签,在请求的时候,所有html和css解析停止,等待js的文件返回和执行,完毕之后才开始接着解析html和css,一直等到html和css解析完成,一条html的DOM树,一条css的规则树。
5,有了DOM树和规则树,开始结合成渲染树,同时将渲染树开始进行布局和绘画,后面要是有js操作DOM节点,又会进行重新布局和重绘。
1、请求资源不是一开始解析html就请求资源,也不是解析到了link标签或者script标签的时候解析资源,而是在解析html构建DOM的时候如果浏览器觉得时候比较长的时候就开始请求后面的资源。
2、请求index.html时,如果内容太多会分段请求,解析的时候也回分段解析,请求不会是遇到标签时候开始解析的,浏览器会自动判断时候请求
3、js操作DOM也不一定马上回引起重绘,引擎会积攒一批。
问题:1、一定要下载完html才会开始解析html标签吗?
不是,下载一部分就开始解析,解析遇到时间长的会请求下面的资源。
2、什么时候下载css文件和js文件?
浏览器自己判断,可能会在解析html的时候
3、什么情况下解析html会受到阻塞?
js下载执行的时候
4、css文件下载会阻塞html解析吗?会阻塞文档的渲染吗?
不会,会。只要渲染不成功,页面就不会显示内容。