# 1.处理HTML生成dom树 把获取到的html代码解析成一个dom树,html的每一个tag都是一个dom树中的一个节点,根节点就是我们常用的document对象,但是并不包含我们用js创建的节点,因为在这里js还没开始执行!!

2.处理CSS生成CSSDOM树

浏览器把所有样式,包括css和浏览器的默认样式解析成样式结构体,在解析过程中会去掉浏览器不能识别的样式,然后生成CSSDOM树

3.将两树合并成render树

dom树和css树合并成render树。render树中的每一个dom节点都有自己的style样式,即css样式。并且render树不包含display:none,和无样式呈现的节点比如head。但是对于visible:hidden和opacity:0,还是会渲染到render上面的。

要注意的是,即使是script节点,也是不会渲染到render树的 (参考文献

# 4.对render树进行布局计算 根据css计算布局,精确表达每一个盒子大小以及状态,同时所有的相对度量单位都会转换成绝对像素位置。根据css2标准,render 树中的每一个节点都被称为box,box的所有属性:width height margin padding border left top right bottom 等等

# 5.将ender树中的每一个节点绘制到屏幕上 这个阶段成为“绘制”或者“栅格化”

# 6.重排重绘

  • 网络通信和HTML解析
  • JavaScript执行
  • 样式计算布局 即重排
  • 重绘

查看方式 Chrome Performance

通过重排重绘提高页面加载速度

针对网络通信和HTML解析的优化

1. js防抖 debounce

  • 概念: 在事件被触发n秒后再执行回调,如果在这n秒内又被触发,则重新计时

  • 生活中的实例: 如果有人进电梯(触发事件),那电梯将在10秒钟后出发(执行事件监听器),这时如果又有人进电梯了(在10秒内再次触发该事件),我们又得等10秒再出发(重新计时)。

  • 例如百度搜索,监听input输入框输入的时候,只要输入改变,都会发生一次请求,出现类似抖动的效果。为了解决这一问题,利用超时器即可实现防抖功能。只从最后输入停止开始计时,0.5s后才开始发起请求

2.js节流 throttle

  • 概念: 规定一个单位时间,在这个单位时间内,只能有一次触发事件的回调函数执行,如果在同一个单位时间内某事件被触发多次,只有一次能生效

  • 生活中的实例: 我们知道目前的一种说法是当 1 秒内连续播放 24 张以上的图片时,在人眼的视觉中就会形成一个连贯的动画,所以在电影的播放(以前是,现在不知道)中基本是以每秒 24 张的速度播放的,为什么不 100 张或更多是因为 24 张就可以满足人类视觉需求的时候,100 张就会显得很浪费资源。

3.懒加载


针对JavaScript执行的优化

dom优化、算法优化、数据结构优化 (相关书籍:高性能JavaScript

重排重绘的优化

利用执行队列

具体demo:

// 源代码:

div.style.left = div.offsetLeft + "px"
div.style.top = div.offsetTop + "px"

// 放到执行队列之中执行

var left =  div.offsetLeft + "px"
var top =  div.offsetTop + "px"

div.style.left = left
div.style.top = top
离线操作dom

如使用隐藏元素 document.createDocumentFragment() cloneNode()

利用类名切换或修改css样式