先记住一个前提: dom级的性能优化绝大多数都是为了减少layout的代价
虚拟Dom是为了性能考虑?
这样说一部分是对的
因为无论是react还是vue,其帮忙接管了实际操作dom的步骤,以数据驱动视图的方式工作,大大简化了开发步骤
但是这也是有代价的
对于常规的操作dom而言,这种情况下开发者反而知道哪些改动是最小化的改动,因为自己操作dom只需要修改变化的部分就好了
而对于数据驱动视图的框架而言,开发者只需要修改特定的状态,而不是直接明确我就修改这个地方的dom,因此框架需要计算这个状态变化所对应的最小化dom操作,而虚拟dom就是实现路径
因此这么理解更正确
虚拟Dom是在数据驱动试图的模式中,最小化修改Dom的一种实现方式
何为最小化改动?
最小化改动就意味着高性能吗?
大部分情况下是,但是并不能直接划等号
最小化改动意味着已经发生的这些变化,最少操作Dom,但是并不能直接认为最少操作就是性能最优解,因为性能最优解应该是最少的重排次数
最少的Dom操作不能和最少重拍次数划等号,因为有时候大量的dom操作发生重拍次数甚至会少于简单的一个dom操作,具体取决于页面稳定性
所以这样理解更正确
虚拟dom计算出的最小化改动,是在框架实现角度尽力实现最小重排次数的方式
日常开发中应该怎么做?
页面的稳定性
时刻注意页面的稳定性,不要因为一个或者几个dom的变化就引起整个页面布局的剧烈变动,这是开发常识,也是最小化重排的最优解
注意设计页面时,发生变动尽量是最小化的局部的,不要让大量的元素需要重新计算其位置
善用提升为独立合成层的css属性
对满足特定情况下,如不需要该元素的移动推动其他元素位置发生改变,使用如transform,来移动dom位置而不是修改left,top等元素
其高效的原因:
- transform会创建新的合成层来使用GPU的硬件加速,其移动会被视作是矩阵运算,而GPU天生擅长矩阵运算,更重要的是,不需要通过常规的layout计算该元素的位置
- transform会创建新的层叠上下文,此时元素的移动不会挤开其他元素让其他元素发生重排
但是要注意,transfrom后的元素仍占据原来文档流的位置,只是其视觉位置发生了变化,所以要选择合适的时机使用