天天看点

从模板到虚拟Dom 再到 DOM树

是什么

1,虚拟dom:js直接操作dom的代价是相对昂贵的,每次操作dom都会让浏览器茶农头开始执行一遍流程,

                       每次更新执行一次,假若我某一次操作导致页面有10个节点更新,js直接操作dom就是10次浏览器计算,

                       而虚拟dom则会将10次更新对比旧代码保存在一个js对象(虚拟dom)中,然后一次性更新到Dom树上,这样就节省了大量无用的计算

                       而且,单个节点更新虚拟dom要比实际操作dom更新要快得多.

2,AST:vue模板想要转换成虚拟dom,就需要处理模板上插值,指令,而AST便是为了描述vue模板而生的,他可以通过对象来描述模板结构有什么,

                需要执行什么,最后使用对应render函数生成新的虚拟dom,AST本身是不会变的,他只会在模板编译阶段出现,而后续的数据更新时不会变更AST,

                变更只有AST上代表变量的值,然后经过render生成新的虚拟Dom

3,diff算法:所谓diff算法其实就是新虚拟dom与旧虚拟dom的对比算法

    1)同层级对比,若相同再开始深度对比

    2)深度对比优先,直到该分支的节全部对比完毕在移动位置对比其他分支

    3)对比方式

         a,此节点是否被移除 -> 添加新的节点

         b,节点一样,属性是否被改变 -> 旧属性改为新属性

         c,节点一样,文本内容被改变-> 旧内容改为新内容

         d,节点要被整个替换 -> 结构完全不相同 移除整个替换

    4)优化策略

         注意:只有在同一个虚拟节点才会精细比较,否则直接删除,比如,ul里的10个li

         a,旧前与新前

         b,旧后与新后

         c,旧前与新后

         d,旧后与新前

继续阅读