html的解析流程

先抛出几个问题:

          1、DomContentLoad是什么 ?

           2、Load是什么 ?

          3、paint是什么

          4、js会阻塞dom的解析吗,js会阻塞dom的渲染吗 ?

          5、css会阻塞dom的解析吗,css会阻塞dom的渲染吗 ?

          6、img会阻塞dom的解析吗,img会阻塞dom的渲染吗 ?

          7、js前有css 与 js前面无css 对html 的解析有什么区别 ?

          8、总结下html的解析流程是什么

在讲解这几个问题之前,必须要用到一个工具,chrome开发者工具里的 Performance,如下图所示:

使用方法,在点击2的情况下,分析3,4,5就可以了。3是日志log,4主要记录了在html页面加载过程中的种种操作,5是4的具体某个操作对应的具体信息。

4里面主要有

Send Request                                    发送http请求

Receive Response                             接收http返回数据

Parse HTML                                       解析html

Parse Stylesheet                                解析css文件

Evaluate Script                                   执行js脚本

domContentLoadedEventEnd            dom创建完成     

 Paint                                                  渲染页面

loadEventEnd                                     页面加载完成

这些操作。

对于一二三这三个问题可以先解释了。

         DomContentLoad就是dom创建完成时的事件

         Load就是页面所有资源都加载之后的事件

         paint就是页面绘制的事件

         先后顺序: DomContentLoad   ---   paint  ---    Load

那么再来看第四个问题

        这个问题很简单大家都知道,js会阻塞dom的解析,但js不会阻塞dom的渲染,因为此时js代码已经全部执行完成了。(还是简单说下验证方法,外部引入一个js脚本,你会发现js的脚本执行事件 Evaluate Script 是在  domContentLoadedEventEnd之前的)

再来看第五个问题,这个问题要看几种情况

        1、整个页面只引入一个外部css文件

        2、css页面后面有外部js文件

先来看第一种情况,这个时候

        先解释下,此图无法截图paint,执行顺序 domContentLoadedEventEnd  - Parse Stylesheet - Paint

        domContentLoadedEventEnd在Parse Stylesheet之前,Parse Stylesheet在Paint前,说明css是不阻塞dom解析的,但是css          是阻塞dom渲染的。

再来看第二种情况,css文件后面有外部js文件

这个图可以很清楚的看出,css是阻塞了dom的解析的,这主要是因为css后面还有js,考虑到js可能会改变css属性,所有必须等到它前面的css执行完毕。

再来看第六个问题,img对html解析的影响

对于这个问题也得分两种情况来分析,不用分析js,因为js会阻塞dom的解析,在domContentLoadedEventEnd之前 ,而img decode在domContentLoadedEventEnd之后

      1、没有外部css文件

       2、有外部css文件

那么还是先来看第一种情况

此图可以清楚的看出,img对dom的解析没有阻塞,但是会阻塞dom的渲染(只是第一次返回的部分图片数据)。这里值得一提的是图片并不是一次性加载完成的,而是分了很多次请求才完全加载,如果用charles(青花瓷)模拟慢网速,会看得非常明显。

再来看第二种情况

可以看到css的解析是在图片首次解码前的。

到此处,应该是可以做一个总结了,但是不行,因为还有一点没有讲,看下图

看出什么重点了吗? 浏览器是按顺序解析html文档的,但是浏览器解析html文档的第一步,是并行发出请求来请求所有的外部资源。然后再从头开始解析,如果有js等外部资源还没有加载则需要等待。

 

总结:

1.  解析HTML结构。

2.  并行加载脚本、样式表文件、img等外部资源

3、如有js文件未下载,则等待下载完成(js文件前如有css文件,则需要先等css文件下载完成)

4.  脚本下载后立即执行,然后从当前解析处开始解析

5.  DOM树构建完成。//DOMContentLoaded

6.  解析外部css文件,img图片等资源

7.  paint,渲染页面

8.   页面加载完毕。//load

猜你喜欢

转载自blog.csdn.net/Lonely_Devil/article/details/81153443
今日推荐