需要记住的是:
-
css不会阻塞dom的解析。但是css会阻塞页面的渲染。
-
js也就是script标签会阻塞dom解析。(defer, async不会)
-
css也会阻塞js(js会等待css下载完)。
为什么?
因为浏览器无法预先知道<script></script>中的内容。而在js中又有可能会获取dom的样式。所以浏览器为了确保js可以获取最新的dom样式(遇到script标签会重新渲染一次),从而让js等待css下载完之后才执行(script标签前面的css样式)
对于下面这种,将Link与script放在header中,且link放到script前面
<header>
<link ref='stylesheet' href='...'>
<script src='...'></script>
</header>
若是 link的css样式文件加载比较快则看不出什么影响。但若是慢的话,则会出现阻塞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解析完之后再执行