react diff 原理

news/2024/12/23 0:34:27/

eact diff 作为 Virtual DOM 的加速器,其算法上的改进优化是 React 整个界面渲染的基础,以及性能提高的保障,同时也是 React 源码中最神秘、最不可思议的部分,本文将剖析 React diff 的不可思议之处。

React 中最值得称道的部分莫过于 Virtual DOM 与 diff 的完美结合,特别是其高效的 diff 算法,让用户可以无需顾忌性能问题而”任性自由”的刷新页面,让开发者也可以无需关心 Virtual DOM 背后的运作原理,因为 React diff 会帮助我们计算出 Virtual DOM 中真正变化的部分,并只针对该部分进行实际 DOM 操作,而非重新渲染整个页面,从而保证了每次操作更新后页面的高效渲染,因此 Virtual DOM 与 diff 是保证 React 性能口碑的幕后推手。

diff 策略

1、Web UI 中 DOM 节点跨层级的移动操作特别少,可以忽略不计。

2、拥有相同类的两个组件将会生成相似的树形结构,拥有不同类的两个组件将会生成不同的树形结构。

3、对于同一层级的一组子节点,它们可以通过唯一 id 进行区分。

以上三个策略,React 分别对 tree diff、component diff 以及 element diff 进行算法优化,事实也证明这三个前提策略是合理且准确的,它保证了整体界面构建的性能。

tree diff

基于策略一,React 对树的算法进行了简洁明了的优化,即对树进行分层比较,两棵树只会对同一层次的节点进行比较。

既然 DOM 节点跨层级的移动操作少到可以忽略不计,针对这一现象,React 通过 updateDepth 对 Virtual DOM 树进行层级控制,只会对相同颜色方框内的 DOM 节点进行比较,即同一个父节点下的所有子节点。当发现节点已经不存在,则该节点及其子节点会被完全删除掉,不会用于进一步的比较。这样只需要对树进行一次遍历,便能完成整个 DOM 树的比较。

如果出现 dom 节点跨层级的移动操作,因为该节点已经不在原来的 dom 树层, 所以会直接删除该节点,在移动后的 dom 层重建该节点, 可见这种操作的性能代价非常大,所以不推荐这样做。 可以通过 css 样式控制节点的隐藏和显示来代替节点跨层级移动的操作。

component diff

React 是基于组件构建应用的,对于组件间的比较所采取的策略也是简洁高效。

如果是同一类型的组件,按照原策略继续比较 virtual DOM tree。

如果不是,则将该组件判断为 dirty component,从而替换整个组件下的所有子节点。

对于同一类型的组件,有可能其 Virtual DOM 没有任何变化,如果能够确切的知道这点那可以节省大量的 diff 运算时间,因此 React 允许用户通过 shouldComponentUpdate() 来判断该组件是否需要进行 diff。

如下图,当 component D 改变为 component G 时,即使这两个 component 结构相似,一旦 React 判断 D 和 G 是不同类型的组件,就不会比较二者的结构,而是直接删除 component D,重新创建 component G 以及其子节点。虽然当两个 component 是不同类型但结构相似时,React diff 会影响性能,但正如 React 官方博客所言:不同类型的 component 是很少存在相似 DOM tree 的机会,因此这种极端因素很难在实现开发过程中造成重大影响的。

element diff

当节点处于同一层级时,React diff 提供了三种节点操作,分别为:INSERT_MARKUP(插入)、MOVE_EXISTING(移动)和 REMOVE_NODE(删除)。

  • INSERT_MARKUP,新的 component 类型不在老集合里, 即是全新的节点,需要对新节点执行插入操作。
  • MOVE_EXISTING,在老集合有新 component 类型,且 element 是可更新的类型,generateComponentChildren 已调用 receiveComponent,这种情况下 prevChild=nextChild,就需要做移动操作,可以复用以前的 DOM 节点。
  • REMOVE_NODE,老 component 类型,在新集合里也有,但对应的 element 不同则不能直接复用和更新,需要执行删除操作,或者老 component 不在新集合里的,也需要执行删除操作。

开发者对同一层级的子节点,可以添加唯一索引进行区分,这样在 diff 时,涉及到只是位置变化的,可以只移动元素,避免删除创建等重复的操作。


http://www.ppmy.cn/news/223777.html

相关文章

华为技术有限公司

华为技术有限公司成立于1988年,是由员工持股的高科技民营企业。从事通信网络技术与产品的研究、开发、生产与销售,专门为电信运营商提供光网络、固定网、移动网和增值业务领域的网络解决方案,是中国电信市场的主要供应商之一,并已…

maters鸿蒙系统,【华为MateRS保时捷版评测】系统:多元素化集合EMUI 8.1体验很棒-中关村在线...

03系统:多元素化集合EMUI 8.1体验很棒 系统:多元素化集合EMUI 8.1体验很棒 华为Mate RS保时捷设计搭载了基于Android 8.1的EMUI 8.1,这也是世界首波基于安卓8.1系统的深度定制化系统,深度集成了谷歌助手服务,也是首波支…

华为rh2288v3服务器显示f02,华为RH2288 V3内部简介_华为 FusionServer RH2288 V3_服务器评测与技术-中关村在线...

华为RH2288 V3内部简介 内部结构的设计往往对服务器的稳定性有着重大的影响,不同部件不同布局可能对服务器的稳定性有着巨大的影响。接下来我们来看下这款RH2288 V3服务器的内部结构。通过机器顶盖上的锁扣即可轻易打开。 为了方便用户对内部的查看,RH22…

华为北研所参观感受

1) 有关北研所概况和从事工作:现在大约有6000人,相比华为在很多城市的研发基地,人数并不算多。北研所主要负责IP(PS: IP是啥玩意,依稀觉得跟路由器有关)的研发,包括软件和硬件层次。 2) 有关华为…

9月19日科技资讯|ofo 悄然搬离中关村;董明珠称向雷军学互联网营销;Chrome 77 发布

「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道。风里雨里,我们将每天为朋友们,播报最新鲜有料的新闻资讯,让所有技术人,时刻紧跟业界潮流。 整理 | 胡巍巍 责编 …

华为自营“前店后厂” 助力企业“上云用数赋智”

关注云报 洞察深一度 传统企业数字化转型战略的加快落地,与“后疫情时代”的催化作用使然,企业上云用云的规模、速度以及深度都超越以往。在企业用户眼中,什么样的云才是最受青睐的? 随需应变、快速增长的云无疑是用户最青睐的&am…

进了华为

大家好,今天给大家分享一位博士从大学毕业入职华为到今年退休的经历,他将自己22年的职业生涯都奉献给了华为,让我们一起学习他的感悟与经验,以下为原文。 转眼在我厂已经度过近22年,近日跟部门领导和HR正式提出了退休申…

华为智慧屏v65鸿蒙系统评测,【华为智慧屏V65评测】从荣耀智慧屏到华为智慧屏 大屏时代已经拉开-中关村在线...

“我们处在一个伟大变革的时代,华为基于全场景智慧化战略,将以创新科技开启智慧屏新时代。”——余承东 2017年冬天,华为发布了全新的企业愿景:“构建万物互联的智能世界”,替代了之前的Slogan“更美好的全连接世界。”…