前端性能优化六:css阻塞

1. css加载会阻塞DOM树的解析和渲染吗?

(1). html代码:

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <style>
      h1 {
        color: red !important
      }
    </style>
    <script>
      function h () {
        console.log(document.querySelectorAll('h1'))
      }
      setTimeout(h, 0)
    </script>
    <link href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap.css" rel="stylesheet">
  </head>
  <body>
    <h1>这是红色的</h1>
  </body>
</html>

(2). 打开一个新窗口,打开chrome的network,设置下载速度为slow 3G:

js 复制代码
①. html页面最开始就是Finished状态.

②. bootcss刚开始处于pending状态:
    a. 当css还没加载完成时,h1并没有显示.
    b. 但此时控制台输出内容.
    c. 直到css加载完成后,红色字体才显示出来.即:内容虽然解析了,但并没有被渲染出来.

③. 结论:
    a. DOM树至少已经解析完成到了h1那里.
    b. 此时css还没加载完成. => css并不会阻塞DOM树的解析.
    c. 加载完成后才显示. => css加载会阻塞DOM树渲染.

加载css时,可能会修改DOM节点的样式,如果css加载不阻塞DOM树渲染的话,那么当css加载完之后,DOM树可能又得重新重绘或者回流了,这就造成了一些没有必要的损耗。所以我干脆就先把DOM树的结构先解析完,把可以做的工作做完,然后等你css加载完之后,在根据最终的样式来渲染DOM树,这种做法性能方面确实会比较好一点。

2. css加载会阻塞js运行吗?

(1). html代码:

html 复制代码
<!DOCTYPE html>
<html lang="en">
  <head>
    <script>
      console.log('before css')
      var startDate = new Date()
    </script>
    <link href="https://cdn.bootcss.com/bootstrap/4.0.0-alpha.6/css/bootstrap.css" rel="stylesheet">
  </head>
  <body>
    <h1>这是红色的</h1>
    <script>
      var endDate = new Date()
      console.log('after css')
      console.log('经过了' + (endDate -startDate) + 'ms')
    </script>
  </body>
</html>

(2). 打开一个新窗口,打开chrome的network,设置下载速度为slow 3G:

js 复制代码
①. html页面最开始就是Finished状态.

②. bootcss刚开始处于pending状态:
    a. 当css还没加载完成时,h1并没有显示.
    b. 但此时控制台输出内容:before css. => css加载前的js代码先执行了.
    c. 直到css加载完成后,文字才显示出来. => css加载后的js代码没有执行.
    d. 此时,才显示after css、经过了5662ms.

③. 结论:
    a. css加载会阻塞后面的js语句的执行.
相关推荐
李剑一3 分钟前
要闹哪样?又出现了一款新的格式化插件,尤雨溪力荐,速度提升了惊人的45倍!
前端·vue.js
闲云一鹤10 分钟前
Git LFS 扫盲教程 - 你不会还在用 Git 管理大文件吧?
前端·git·前端工程化
阿虎儿1 小时前
React Context 详解:从入门到性能优化
前端·vue.js·react.js
Sailing1 小时前
🚀 别再乱写 16px 了!CSS 单位体系已经进入“计算时代”,真正的响应式布局
前端·css·面试
喝水的长颈鹿1 小时前
【大白话前端 03】Web 标准与最佳实践
前端
爱泡脚的鸡腿1 小时前
Node.js 拓展
前端·后端
左夕3 小时前
分不清apply,bind,call?看这篇文章就够了
前端·javascript
Zha0Zhun3 小时前
一个使用ViewBinding封装的Dialog
前端
兆子龙3 小时前
从微信小程序 data-id 到 React 列表性能优化:少用闭包,多用 data-*
前端
滕青山3 小时前
文本行过滤/筛选 在线工具核心JS实现
前端·javascript·vue.js