浏览器渲染流程
JavaScript -> Style -> Layout -> Paint -> Composite
- 浏览器构建对象模型
- 构建 DOM
HTML -> DOM
- 构建 CSSOM
CSS -> CSSOM
- 渲染树只包含页面需要的节点
- 布局计算每个节点精确的大小与位置-“盒模型”
- 绘制是像素化每个节点的过程
影响回流(再次布局)的操作
- 添加与删除节点
- display: none
- 移动元素位置
- 操作 styles
- offsetLeft, scrollTop, clientWidth
- 修改浏览器大小,字体大小
避免 layout thrashing(布局抖动)
避免回流(reflow)
- 使用 transform 替代会导致回流的操作
读写分离
- 批量处理
- React VDOM,数据批量处理后再更新视图
- fastdom
- 读操作放入 fastdom.measure 方法中
- 写操作放入 fastdom.mutate 方法中
复合线程(compositor thread)与图层(layers)
复合线程
- 将页面拆分图层进行绘制再进行复合
- 利用 DevTools 了解网页的图层拆分情况
- 图层拆分粒度要适中
- 哪些样式仅影响复合
减少重绘(repaint)
- 利用 DevTools 识别 paint 瓶颈
- 利用 will-change 创建新的图层
高频事件处理函数的防抖
一帧的生命周期
React 时间调度实现
基本原理
- requestIdleCallBack,但有兼容性问题
- 通过 rAF 模拟 rIC