dom
虚拟dom
虚拟dom就是利用js来模拟dom操作,在需要大量操作dom的情况下, 能够减少浏览器的重绘和回流,提高性能;
虚拟dom更新流程
- 真实dom更新映射为虚拟dom
- 虚拟dom变化后根据差距生成patch
- 根据patch来更新真实dom,反馈到界面
diff算法
diff算法探讨的是虚拟dom发生变化之后生成dom树更新补丁的方式,通过对比生成差异,以最小的代价来更新dom
diff算法重点
- 更新时机 但虚拟dom发生变化的时候
- 遍历算法 深度优先遍历算法/广度优先遍历算法 react采用深度优先遍历,避免react生命周期顺序出现错误
- 优化策略 分治
react的diff算法
react优化策略
- 忽略节点跨层级操作场景,提升效率
- 组件的class一致则为相似的树结构,否则默认为不同的树结构
- 同一层级的子节点可以通过列表key的方式进行对比
- fiber机制下节点与树分别采用fiberNode与fiberTree进行重构
- fiber机制下整个更新过程由current与workInProgress两株树双缓冲完成
如何根据diff算法来优化组件
- 尽量避免组件的跨层级移动
- 通过设置唯一的key和减少组件深度来提高diff性能
- 通过设置shouldComponentUpdate和pureComponent减少diff次数
real dom 和虚拟dom的对比
虚拟dom的优点
- 简单方便:如果使用手动操作真实DOM来完成页面,繁琐又容易出错,在大规模应用下维护起来也很困难
- 性能方面:使用Virtual DOM,能够有效避免真实DOM数频繁更新,减少多次引起重绘与回流,提高性能
- 跨平台:React借助虚拟DOM, 带来了跨平台的能力,一套代码多端运行
虚拟dom的缺点
- 在一些性能要求极高的应用中虚拟DOM无法进行针对性的极致优化
- 首次渲染大量DOM时,由于多了一层虚拟DOM的计算,速度比正常稍慢
真实DOM的缺点
- 效率低,解析速度慢,内存占用量过高
- 性能差:频繁操作真实DOM,易于导致重绘与回流