164  
查询码:00001067
虚拟DOM的实现原理和优劣对比
来源:https://blog.csdn.net/WU5229485/article/details/103685353
作者: 朱凡 于 2020年05月01日 发布在分类 / FM组 / FM_App 下,并于 2020年05月01日 编辑
虚拟 博客 什么 一个 程序 程序员 操作 数据 性能 我们

虚拟DOM的实现原理和优劣对比


Web界面由DOM树(树的意思是数据结构)来构建,当其中一部分发生变化时,其实就是对应某个DOM节点发生了变化。

虚拟DOM就是为了解决浏览器性能问题而被设计出来的。如前,若一次操作中有10次更新DOM的动作,虚拟DOM不会立即操作DOM,而是将这10次更新的diff内容保存到本地一个JS对象中,最终将这个JS对象一次性attch到DOM树上,再进行后续操作,避免大量无谓的计算量。所以,用JS对象模拟DOM节点的好处是,页面的更新可以先全部反映在JS对象(虚拟DOM)上,操作内存中的JS对象的速度显然要更快,等更新完成后,再将最终的JS对象映射成真实的DOM,交由浏览器去绘制。

虚拟DOM概念随着react的诞生而诞生,由facebook提出,其卓越的性能很快得到广大开发者的认可;继react之后vue2.0也在其核心引入了虚拟DOM的概念;

本章节,我们来逐步学习虚拟DOM的原理及其性能的优劣知识点梳理:

什么是虚拟DOM ?

虚拟dom可以看作是一个使用javascript模拟了DOM结构的树形结构,这个树结构包含整个DOM结构的信息,如下图所示:

在这里插入图片描述

为什么使用虚拟DOM ?

之前使用原生js或者jquery写页面的时候会发现操作DOM是一件非常麻烦的一件事情,往往是DOM标签和js逻辑同时写在js文件里,数据交互时不时还要写很多的input隐藏域,如果没有好的代码规范的话会显得代码非常冗余混乱,耦合性高并且难以维护。

另外一方面在浏览器里一遍又一遍的渲染DOM是非常非常消耗性能的,常常会出现页面卡死的情况;所以尽量减少对DOM的操作成为了优化前端性能的必要手段,vdom就是将DOM的对比放在了js层,通过对比不同之处来选择新渲染DOM节点,从而提高渲染效率。

patch函数

patch函数的执行分为两个阶段,两次传递的参数都是两个

第一阶段为虚拟dom的第一次渲染,传递的两个参数分别是放真实DOM的container和生成的vnode,此时patch函数的作用是用来将初次生成的真实DOM结构挂载到指定的container上面。

第二阶段传递的两个参数分别为vnode和newVnode,此时patch函数的作用是使用diff算法对比两个参数的差异,进而更新参数变化的DOM节点;

可以发发现h函数和patch函数在cnabbdom中实现vdom到真实DOM的转化起到了至关重要的作用,那么还有一个很重要的环节,patch函数中是怎么样实现对比两个vnode从而实现对真实DOM的更新的呢,这里还要提一下snabbdom的另外一个核心算法,即diff算法。

diff算法

其实在我们日常开发中我们都在接触类似与diff算法的一些软件,比如svn可以看到当前代码和svn服务器上代码的不同之处,再如Beyond Compare这款软件也可以为我们指出两个对比文件的不同之处

但是此处是如何实现对vnode的对比的呢?参考以下代码:

let children = vnode.children || []
let newChildren = newVnode.children || [] children.forEach(function(childrenVnode, index) {
var newChildVnode = newChildren[index] // 首先拿到对应新的节点
if (childrenVnode.tag === newChildVnode.tag) { // 判断节点是否相同 
updateChilren(childrenVnode, newChildVnode) // 如果相同执行递归,深度对比节点 
} else {
repleaseNode(childrenVnode, newChildVnode) // 如果不同则将旧的节点替换成新的节点 
}
})

function repleaseNode(vnode, newVnode) { // 节点替换函数 
let elem = vnode.elem
let newEle = createElement(newVnode)
}



			


 推荐知识

 历史版本

修改日期 修改人 备注
2020-05-01 19:47:03[当前版本] 朱凡 创建版本

 附件

附件类型

PNGPNG

知识分享平台 -V 4.8.7 -wcp