css加载会造成阻塞吗?
参考答案:
先说下结论:
- css加载不会阻塞DOM树的解析
- css加载会阻塞DOM树的渲染
- css加载会阻塞后面js语句的执行
为了避免让用户看到长时间的白屏时间,我们应该尽可能的提高css加载速度,比如可以使用以下几种方法:
- 使用CDN(因为CDN会根据你的网络状况,替你挑选最近的一个具有缓存内容的节点为你提供资源,因此可以减少加载时间)
- 对css进行压缩(可以用很多打包工具,比如webpack,gulp等,也可以通过开启gzip压缩)
- 合理的使用缓存(设置cache-control,expires,以及E-tag都是不错的,不过要注意一个问题,就是文件更新后,你要避免缓存而带来的影响。其中一个解决防范是在文件名字后面加一个版本号)
- 减少http请求数,将多个css文件合并,或者是干脆直接写成内联样式(内联样式的一个缺点就是不能缓存)
原理解析
浏览器渲染的流程如下:
- HTML解析文件,生成DOM Tree,解析CSS文件生成CSSOM Tree
- 将Dom Tree和CSSOM Tree结合,生成Render Tree(渲染树)
- 根据Render Tree渲染绘制,将像素渲染到屏幕上。
从流程我们可以看出来:
- DOM解析和CSS解析是两个并行的进程,所以这也解释了为什么CSS加载不会阻塞DOM的解析。
- 然而,由于Render Tree是依赖于DOM Tree和CSSOM Tree的,所以他必须等待到CSSOM Tree构建完成,也就是CSS资源加载完成(或者CSS资源加载失败)后,才能开始渲染。因此,CSS加载是会阻塞Dom的渲染的。
- 由于js可能会操作之前的Dom节点和css样式,因此浏览器会维持html中css和js的顺序。因此,样式表会在后面的js执行前先加载执行完毕。所以css会阻塞后面js的执行。
题目要点:
答题思路
传统浏览器行为:
- 在传统浏览器中,CSS文件是阻塞渲染过程的。浏览器会等待CSSOM(CSS对象模型)构建完成后,才会与DOM(文档对象模型)一起生成渲染树(Render Tree),然后开始页面的渲染。因此,如果CSS文件加载缓慢,会导致页面渲染的延迟。
现代浏览器优化:
- 现代浏览器对CSS的加载和渲染过程进行了一定的优化。例如,通过异步加载CSS(如使用
<link rel="preload" as="style" href="...">)或利用媒体查询(Media Queries)来控制CSS的加载时机,可以减少CSS对页面渲染的阻塞影响。 - 但是,即使采用了这些优化手段,CSS的加载仍然会对页面渲染产生一定的影响,只是程度可能有所减轻。
- 现代浏览器对CSS的加载和渲染过程进行了一定的优化。例如,通过异步加载CSS(如使用
结论:
- 总体上,CSS加载确实会造成一定的阻塞,但这种阻塞可以通过合理的加载策略和浏览器优化来减轻。
考察要点
- 对CSS加载机制的理解:面试者是否了解CSS是如何被浏览器加载和处理的,以及这个过程中可能遇到的问题。
- 浏览器优化知识:面试者是否了解现代浏览器在CSS加载和渲染方面所做的优化措施。
- 性能优化意识:面试者是否具备通过合理的加载策略来减轻CSS加载对页面性能影响的意识。