浏览器在解析渲染html、JS、css时的机制问题

今天在掘金看了一篇关于JS,CSS在浏览器的加载、渲染的机制问题,感觉涨知识了。当然,为了以后方便回顾,就顺带搬过来咯。对于之前不太了解浏览器的渲染问题的小伙伴可能会被绕晕,这里需要注意的是两个词,渲染解析。注意分清楚他们的机制,阅读下文的时候也要注意留心到底哪个阶段阻塞的是渲染还是解析。

笔记总结:

一、js执行会阻塞DOM的解析渲染;

二、CSS加载不会阻塞DOM树的解析;

三、CSS加载会阻塞DOM树的渲染

根据原作者解释,这种机制可能也是浏览器的一种优化机制。当加载CSS的时候,可能会涉及修改下面DOM节点样式,如果CSS加载不会阻塞DOM树渲染的话,那么当CSS加载完之后,DOM树可能又需要重新重绘或者回流,这就造成了一些没有必要的损耗。所以浏览器会选择先把DOM树的结构先解析完,把可以做的工作做完,然后等你CSS加载完之后,在根据最终的样式来渲染DOM树,这种做法性能方面会比较好一点。

四、CSS加载会阻塞后面JS语句的执行

大佬补充:在没有JS的理想情况下,html与CSS会并行解析,分别生成DOM与CSSOM,然后合并成Render Tree,进入Rendering Pipeline;但如果有JS,CSS加载会阻塞后面JS语句的执行,而(同步)JS脚本执行会阻塞其后的DOM解析(所以通常会把CSS放在头部,JS放在body尾)。不严谨地说,某些情况下CSS会因为JS脚本间接阻塞DOM解析

因此,为了避免让用户看到长时间的白屏时间,我们应该尽可能的提高CSS加载速度,比如可以使用以下几种方法:

1、使用CDN(因为CDN会根据你的网络状况,替你挑选最近的一个具有缓存内容的节点为你提供资源,因此可以减少加载时间)

2、对CSS进行压缩(可以用很多打包工具,比如webpack,gulp等,也可以通过开启gzip压缩)

3、合理的使用缓存(设置cache-control、expires以及E-tag都是不错的,不过要注意一个问题,就是文件更新后,你要避免缓存而带来的影响。其中一个解决防范是在文件名字后面加一个版本号)

4、减少http请求数,将多个CSS文件合并,或者是干脆直接写成内联样式(内联样式的一个缺点就是不能缓存)

陈健的个人博客,记录生活所见所感、学习笔记。专注于Web前端_SEO教程_读书心得。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

返回主页看更多
狠狠的抽打博主 支付宝 扫一扫