注册

css 加载阻塞问题,无废话

一、问题 & 结论

1. css 加载会阻塞 DOM 树的解析渲染吗 ?
  • css 并不会阻塞 dom 树的解析
  • css 会阻塞 dom 树的渲染
2. css 加载会阻塞 js 运行吗 ?
  • css 加载会阻塞后面 js 语句的执行

二、造成的结果以及优化方案

1. 造成的结果
  • css 加载缓慢会造成长时间的白屏

2. 优化方案
  1. CDN 加速:CDN 会根据网络状况,挑选一个最近的具有缓存内容的节点提供资源,减少加载时间
  2. 对 css 进行压缩:使用打包工具 webpack、gulp 等,开启 gzip 压缩
  3. 合理的使用缓存:强缓存、协商缓存等策略
  4. 减少 http 请求次数,合并 css 文件,或者干脆写成内联样式(缺点:不能缓存)

三、原理解析

1. 浏览器的渲染过程如下图所示:

160570955a1b1f5046d763172865e9c9.png

2. 结论如下:


  • 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 的执行

四、实际场景


1. 页面加载的两个事件


  • onLoad:等待页面的所有资源都加载完成才会触发,这些资源包括 css、js、图片视频等
  • DOMContentLoaded:就是当页面的内容解析完成后,则触发该事件

2. css 加载的影响


  • 如果页面中同时存在 css 和 js,并且存在 js 在 css 后面,则 DOMContentLoaded 事件会在 css 加载完后才执行
  • 其他情况下,DOMContentLoaded 都不会等待 css 加载,并且 DOMContentLoaded 事件也不会等待图片、视频等其他资源加载

链接:https://juejin.cn/post/6967530166520119332





0 个评论

要回复文章请先登录注册