关于js, css是否阻塞dom的解析与渲染

169 阅读2分钟

需要记住的是:

  • css不会阻塞dom的解析但是css会阻塞页面的渲染。

  • js也就是script标签会阻塞dom解析。(defer, async不会)

  • css也会阻塞js(js会等待css下载完)

​ 为什么?

​ 因为浏览器无法预先知道<script></script>中的内容。而在js中又有可能会获取dom的样式。所以浏览器为了确保js可以获取最新的dom样式(遇到script标签会重新渲染一次),从而让js等待css下载完之后才执行(script标签前面的css样式)

​ 对于下面这种,将Linkscript放在header中,且link放到script前面

<header>
	<link ref='stylesheet' href='...'>
    <script src='...'></script>
</header>

若是 linkcss样式文件加载比较快则看不出什么影响。但若是慢的话,则会出现阻塞script标签,而script标签又会阻塞dom的解析。从而出现页面首次加载时出现一段时间的白屏现象

此外需要注意的是:body内的css会由于浏览器的差异,呈现不同的表现形式。这种情况一般称为浏览器样式闪烁fouc:flash of unstyled content)

补充:

前提:<script src='...'></script>浏览器解析到这里的时候会往src处发送一个get请求


<script src='...' async></script>

表示这个get请求是异步的. 也就是说,浏览器会继续解析dom.等到get请求完之后,若是dom还未解析完,则停下来,执行js代码。若是已经解析完了,那也是立即执行js代码.

特点:

(1)、其包裹的js代码执行的时间是不确定的

(2)、其有可能阻塞解析dom,也有可能不阻塞


<script src='...' defer></script>

同样的,表示这个get请求是异步的。但是,不同的是其**总是执行在dom解析完之后**。即使get请求完之后,dom解析还未完成,这也是等dom解析完之后再执行