关于框架性能优化思考随记

4 阅读3分钟

先记住一个前提: 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后的元素仍占据原来文档流的位置,只是其视觉位置发生了变化,所以要选择合适的时机使用

持续补充ing。。。。。