Diff算法详解

简要了解

  • Diff 算法目的就是找出新旧虚拟dom差异,最小化更新视图;即本质就是比较两个JS对象的差异;
  • 并不是页面上所有的更新都需要Diff算法。

在了解Diff算法之前,我们首先需要了解一下什么是虚拟DOM。

虚拟DOM

虚拟DOM是表示真实DOM的JS对象

这是一段真实DOM:

<div class="container">
    <p class="item">CSDN:浅墨_东</p>
    <strong class="intro">一个前端小白菜</strong>
</div>

它对应的虚拟DOM是下列的一个JS对象:

        let Vnode = {
            tagName: "div",
            props: {
                class: "container",
            },
            children: [
                {
                    tagName: "p",
                    props: {
                        'class': "item",
                    },
                    text:'CSDN:浅墨_东'
                },
                {
                    tagName: "strong",
                    props: {
                        'class': "item",
                    },
                    text:'一个前端小白菜'
                },
            ],
        };

里面包含字段有:标签名、标签属性、子标签名称属性、文本节点。

我们在了解虚拟DOM之后,就可以来了解Diff算法

Diff算法

如果我们修改了上面真实DOM的文本内容: 

<div class="container">
    <p class="item">CSDN:浅墨_东</p>
    <strong class="intro">专注分享前端干货</strong>
</div>

就会生成一个新的虚拟DOM:

        let Vnode = {
            tagName: "div",
            props: {
                class: "container",
            },
            children: [
                {
                    tagName: "p",
                    props: {
                        'class': "item",
                    },
                    text:'CSDN:浅墨_东'
                },
                {
                    tagName: "strong",
                    props: {
                        'class': "item",
                    },
                    text:'专注分享前端干货'
                },
            ],
        };

如果能快速找到新旧JS对象之间的差异,就可以最小化的更新视图,那么就产生了 Diff 算法;Diff算法的目的就是找出差异,最小化更新视图。

 原理图

updateChildren 详解

一段真实DOM如果变成右侧DOM结构

内部进行同级比对,减少比对次数 ,最大化提高比对性能

在统计比对的时候,采用的是首尾指针法 

不管是新旧虚拟节点,都有首尾两个元素,对应的是start和end,首先旧虚拟节点的start和新虚拟节点start做比对

如果没有比对成功,旧虚拟节点start和新虚拟节点end做比对 如果依旧没有比对成功,旧虚拟节点end和新虚拟节点start做比对

如果还没有比对成功,旧虚拟节点end和新虚拟节点end做比对 比对规则按照以下顺序进行比较:

 如果旧虚拟节点start和新虚拟节点end比对成功,则真实dom中对应的元素要移动到第4个位置去。(根据新虚拟节点位置)

比对成功,oldS向右侧移动,newE向左侧移动,接着开始第二轮不对

依次进行 .....

最后比对完,发现新虚拟节点有新的元素,我们把新元素添加到真实dom中

✨原创不易,还希望各位大佬支持一下!
👍 点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富! 

Vue 3 使用了一种新的 diff 算法,称为 "优化后的 diff 算法"(Optimized Diff Algorithm),它与 Vue 2 中的 Virtual DOM diff 算法有一些不同之处。 在 Vue 2 中,Virtual DOM diff 算法会对整个虚拟 DOM 树进行深度遍历,并比较新旧两棵树的节点,找出差异并进行更新。这种算法在大型应用中可能会存在性能问题,因为它需要遍历整个树来找到差异。 而在 Vue 3 中,通过使用静态分析和标记技术,优化后的 diff 算法能够跳过不需要比较的子树,从而减少了比较的节点数量,提高了性能。具体来说,优化后的 diff 算法主要包含以下几个步骤: 1. 编译阶段:Vue 3 编译器会对模板进行静态分析,并为每个节点添加静态标记。静态节点是指在组件渲染过程中不会发生变化的节点。编译器还会为动态节点生成动态指令,在运行时根据需要进行处理。 2. 渲染阶段:在组件渲染阶段,Vue 3 会根据静态标记和动态指令进行渲染。对于静态节点,Vue 3 会跳过它们的比较,直接复用旧的节点。对于动态节点,Vue 3 会进行比较,并找出差异。 3. 差异更新:在找到差异后,Vue 3 会使用 patch 算法将差异应用到真实的 DOM 上。由于优化后的 diff 算法能够跳过不需要比较的子树,因此只有少量的节点需要进行更新,从而提高了性能。 总的来说,Vue 3 的优化后的 diff 算法通过静态分析和标记技术,能够跳过不需要比较的静态节点,从而减少了比较的节点数量,提高了性能。这是 Vue 3 在性能方面的一个重要改进。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值