什么是虚拟DOM (virtual dom)(vnode)

1、什么是虚拟 DOM (vdom)

起源
虚拟dom最先是由facebook团队提出的,最先运用在react中,之后在vue2.0版本中引入了虚拟DOM的概念

是什么
虚拟 dom 是相对于浏览器所渲染出来的真实 dom 的,

以往,我们改变更新页面,只能通过首先查找dom对象,再进行修改dom的方式来达到目的。 但这种方式相当消耗计算资源, 因为每次查询 dom ,都需要遍历整颗 dom 树。

现在,我们用对象的方式来描述真实的 dom,并且通过对象与真实dom建立了一一对应的关系,那么每次 dom 的更改,我通过找到相应对象,也就找到了相应的dom节点,再对其进行更新。这样的话,就能节省性能,因为js 对象的查询,比对整个dom 树的查询,所消耗的性能要少。

本质
Vnode的本质就是用树型结构的JS对象描述真实的DOM结构的信息,这个树结构的JS对象包含了整个DOM结构的信息.。

<ul id="list">
   <li class="item">item1</li>
   <li class="ltem">item2</li>
</ul>
//---------------------------------------------------
{
  tag:'ul',
  attrs:{
      id:'list'
  },
  children:[
      {
         tag:"li",
         attrs:{
             className:'item'
         },
         children:['item1']
       },
       {
          tag:'li',
          attrs:{
           className:'item'
          },
          children:['item2']
       }
   ]
}

可见上边的DOM结构,不论是标签名称还是标签的属性或标签的子集,都会对应在下边的树结构里。

2、虚拟 DOM 的优缺点

优点:

  • 降低浏览器性能消耗
    因为Javascript的运算速度远大于DOM操作的执行速度,因此,运用patching算法来计算出真正需要更新的节点,最大限度地减少DOM操作,从而提高性能。

在vnode技术出现之前,我们要改变页面展示的内容只能通过遍历查询 dom 树的方式找到需要修改的 dom,然后修改样式行为或者结构,来达到更新 ui 的目的。这种方式相当消耗计算资源,因为每次查询 dom 几乎都需要遍历整颗 dom树。

在vnode技术出现之后,我们建立一个虚拟 dom 对象来对应真实的 dom 树,那么每次 dom 的更改就变成了 js 对象的属性的更改 ,这样一来就能查找 js 对象的属性变化要比查询 dom 树的 性能开销小。

  • diff算法,减少回流和重绘
    通过diff算法,优化遍历,对真实dom进行打补丁式的新增、修改、删除,实现局部更新,减少回流和重绘。
    vnode优化性能核心思想,就是每次更新 dom 都尽量避免刷新整个页面,而是有针对性的 去刷新那被更改的一部分 ,来释放掉被无效渲染占用的 gpu,cup性能。同时,也减少了大量的dom操作,减少了浏览器的回流和重绘。

  • 跨平台
    虚拟 DOM 本质上是 JavaScript 对象,而 DOM 与平台强相关,相比之下虚拟 DOM ,可以进行更方便地跨平台操作,例如:服务器渲染、weex 开发等等

缺点

  • 首次显示要慢些:
    首次渲染大量DOM时,由于多了一层虚拟DOM的计算, 会比innerHTML插入慢

  • 无法进行极致优化:
    虽然虚拟 DOM + 合理的优化,足以应对绝大部分应用的性能需求,但在一些性能要求极高的应用中 无法进行针对性的极致优化。

3、简述虚拟 DOM 实现原理

虚拟 dom 相当于在 js 和真实 dom 中间加了一个缓存,利用 dom diff 算法避免了没有必要 的 dom 操作,从而提高性能。

具体实现步骤如下:

  • 用 JavaScript 对象结构表示 DOM 树的结构,比如说:一个元素对象,包含TagName、props 和 Children这些属性。然后根据这个对象构建一个真正的 DOM 节点, 插到文档当中;

  • 当数据状态变更的时候,重新构造一棵新的对象树。通过diff 算法,比较新旧虚拟 DOM 树的差异。

  • 根据差异,对真正的 DOM 树进行增、删、改。

4、Virtual DOM 真的比操作原生 DOM 快吗

采用VUE创始人尤雨溪的回答:

**这是一个性能 vs. 可维护性的取舍。**框架的意义在于为你掩盖底层的 DOM 操作,让你用更声明式的方式来描述你的目的,从而让你的代码更容易维护。

没有任何框架可以比纯手动的优化 DOM 操作更快,因为框架的 DOM 操作层需要应对任何上层 API 可能产生的操作,它的实现必须是普适的

在构建一个实际应用的时候,你难道为每一个地方都去做手动优化吗?出于可维护性的考虑,这显然不可能。框架给你的保证是,你在不需要手动优化的情况下,我依然可以给你提供过得去的性能。

5、虚拟DOM怎么转换为真实DOM?

在组件首次被渲染时,先生成虚拟DOM,再根据虚拟DOM树创建真实DOM树,根据真实DOM挂载到页面中正确的位置。此时,每一个虚拟DOM对应一个真实DOM。

在组件受到响应式数据变化时,需要重新渲染了。先是调用render函数创建出一个新的虚拟DOM树,将新旧虚拟DOM树对比,找到最小更新量然后更新虚拟DOM节点。最后根据更新过的虚拟DOM节点,去修改对应的真实DOM节点。

从而准确实现局部的页面渲染。

真实DOM就是一个标签a 、p、div啥的一个具体的节点

虚拟DOM是object对象

  • 22
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 虚拟 DOM 是一种用树型结构的 JavaScript 对象来描述真实的 DOM 结构的信息的技术。它的优点包括:保证性能下限,虚拟 DOM 的性能虽然不是最优的,但相比直接操作 DOM 的性能要好很多,因此在不需要手动优化的情况下,仍然可以提供不错的性能;无需手动操作 DOM,只需要编写好 View-Model 的代码逻辑,框架会根据虚拟 DOM 和数据双向绑定,帮助我们以可预期的方式更新视图,极大提高开发效率。\[1\]\[2\] 虚拟 DOM 的缺点是它的性能并不是最优的,因为它需要适配任何上层 API 可能产生的操作,所以它的一些 DOM 操作的实现必须是普适的。另外,虚拟 DOM 的引入也增加了一定的复杂性和学习成本。\[1\] 总的来说,虚拟 DOM 技术在提高开发效率的同时,也带来了一些性能上的折扣和额外的复杂性。\[3\] #### 引用[.reference_title] - *1* *2* [虚拟 DOM 是什么? 有什么优缺点?](https://blog.csdn.net/zhangyu812/article/details/124446353)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [虚拟dom (virtual dom)(vnode)](https://blog.csdn.net/yiyueqinghui/article/details/105468012)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值