vue-diff算法-snabbdom


前言

vue的diff算法参考自snabbdom

本文将介绍snabbdom的使用 从而深入理解vue的diff算法,工程文件请参考snabbdom文件夹。

1. 实例

直接到github的snabbdom去复制实例来使用

2. 真实dom和虚拟dom

在开篇我们讨论过为什么说虚拟dom的性能优于真实dom,这里再重新验证一遍

diff算法比较的虚拟dom,虚拟dom的成员比较少,比较性能上自然也比较出色

2.1 真实dom

//一个对象 非常多的成员
div#container

2.2 虚拟dom的

//snabbdom的虚拟dom对象 成员较少
{
    "sel": "div#container.two.classes",
    "data": {
        "on": {}
    },
    "children": [
        {
            "sel": "span",
            "data": {
                "style": {
                    "fontWeight": "bold"
                }
            },
            "text": "粗体",
            "elm": {}
        },
        {
            "sel": "br",
            "data": {},
            "elm": {}
        },
        {
            "text": "这是一个普通的文本",
            "elm": {}
        },
        {
            "sel": "br",
            "data": {},
            "elm": {}
        },
        {
            "sel": "a",
            "data": {
                "props": {
                    "href": "https://www.baidu.com"
                }
            },
            "text": "跳转到百度",
            "elm": {}
        },
        {
            "sel": "br",
            "data": {},
            "elm": {}
        },
        {
            "sel": "button",
            "data": {
                "on": {}
            },
            "text": "patchNewVnode",
            "elm": {}
        }
    ],
    "elm": {}
}

3. 虚拟dom的key对性能的影响

注意,这里讨论的性能是虚拟dom之间,和真实dom无关。

key是唯一标识,加上key,那么diff算法就能知道每个节点的真实情况,根据情况进行相应操作,提高性能

例如,js代码上,只是对虚拟dom的节点顺序进行调换

3.1 情况一:

没有使用key就会重新的删除创建

(1)有三个li节点,内容为abc

(2)将其修改为aaabbbccc

(3)置换成新的vdom,发现创建了新dom,那么这种情况性能开支就很大了

3.2 情况二:

使用了key就只是更改顺序

加上key

原图

修改顺序

可以看到只是改变了顺序

改变了顺序

由此我们得出使用key是会提升性能的,因为没有使用key的话,仅仅只是调换节点的顺序就会使用创建删除操作,资源开支大。

4. 新老节点替换规则

1、如果新老节点不是同一个节点名词,那么就暴力删除旧的节点,创建插入新节点。

2、只能是同级比较。跨级,例如在源节点上添加一个父节点,就会创建插入新节点。


文章作者: iamfugui
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 iamfugui !
评论
  目录