虚拟dom及diff算法

vdom,diff

Posted by Lan on January 3, 2020
  • 虚拟dom 其实就是用js对象来模拟dom

  • 为什么要有虚拟dom

    主要是为了解决浏览器性能问题

    其实就是将多次对dom的更新操作放在虚拟dom(其实就是内存中的js对象)上,最后,所有更新完成后,一次应用在真正的dom树上。 这样就减少了对dom的操作次数。

    更重要的意义

    虚拟dom其实也是为了实现跨平台、服务端渲染,提供一个更合理的dom更新策略 虚拟dom对于mvvm框架更加有生命力

  • diff算法

  • 为什么要有diff算法 主要还是为了为了避免或者减少多次操作dom,提升效率

diff算法作用就是找到dom要更新的部分

diff算法就是对比更新前后的虚拟dom,将更新的部分记录下来,先将所有变化都反映在虚拟的dom中,然后最终应用于真实的dom节点中,进行浏览器dom的一次更新。

diff算法只是为了虚拟dom比较更加高效

更新dom树之后,会对比新旧dom树,对比的算法就是diff算法,对比会出现四种情况,得出四种结果数据表,最后将结果数据表通过dom fragment更新到浏览器dom中。

  • 四种情况:
    • 节点类型变化:
      • 直接卸载旧结点,装载新节点,如p变成h
    • 节点类型不变,属性或属性值发生变化
      • 更新属性,如改变class值
    • 文本变化
      • 直接修改文本内容
    • 移动/增加/删除 子节点
      • 每个节点的唯一标识进行区分,尤其是插入的时候,不需要将插入位置后的所有节点都进行移动
  • 三个策略
    • tree diff
    • component diff
    • element diff
  • tree tiff 就是对更新后的新树和之前的旧树进行逐层遍历,从而进行比较
  • 其他两种没看懂,估计也记不住

  • 补充知识:
  • DocumentFragment

    接口表示一个没有父级文件的最小文档对象。它被当做一个轻量版的Document使用,用于存储已排好版的或尚未打理好格式XML片段。最大的区别是因为DocumentFragment不是真实DOM树的一部分, #### 它的变化不会引起DOM树的重新渲染的操作(reflow),且不会导致性能等问题