美文网首页
为什么需要虚拟dom?

为什么需要虚拟dom?

作者: web前端_潘哥哥 | 来源:发表于2022-03-12 12:10 被阅读0次

对于这个问题,我想说,如果你找到了比虚拟dom更加好的方案,你当然可以直接使用这么一套方案去植入到框架中,来解决框架的问题。

我认为引入虚拟dom,是因为开发框架的人为了给我们开发者提供更高的开发效率,不需要关心繁琐的dom操作,减少心智负担,提高代码的可维护性等开发出了这么一套框架出来之后,如何操作dom的问题,就转移到了框架那边了。

框架当然可以在每次数据改变之后,把之前渲染的页面全部不要,重新根据我们最新的数据生成一个新的页面,但是,这样做,效率是不是太低了?

仔细想想,我们可以发现,我们是不是可以复用之前页面的那些dom元素呢?

如果这一次渲染出来的页面跟上一次渲染出来的页面,有很多地方都是可以重复应用的,我们完全可以只改动那些真正发生变化的地方。这样一来,问题又变成了我们要如何知道有哪些地方没有变化,哪些地方又真正发生了变化呢?

这时框架开发者们就想出了引入虚拟dom这么一种解决方案

我们先来了解一下虚拟dom是什么:

我们可以理解为,虚拟dom的本质其实就是一个普通的js对象而已,它里面有一些属性,描述了一个真实dom的一些核心的属性和父子结构。如:

const div = {
    tag: 'div',
    props: {
        'id': '#app'
    },
    children: [{
        tag: 'p',
        children: 'this is a p'
    }]
}

这个div变量保存的对象就可以看作是一个虚拟dom。

在我们了解虚拟dom是什么之后,我们再来看一下框架开发者们是如何将它应用到框架中去的。

框架开发者做出了一套响应式系统后,就有能力给我们开发者提供当数据发生变化时,通知某一些函数重新运行。在框架内部,维护着这么一个流程:

render函数的执行,会返回一个虚拟dom,我们用vnode代替。当数据发生变化,通知我们的render重新运行,运行之后,拿到最新的vnode,也就是描述这次数据变更之后,我们最新的视图长什么样子。然后并没有直接根据这个最新的vnode来操作真实dom来渲染最新的视图,而是将最新的vnode与之前旧的vnode,进行一个对比,找到真正需要更新的地方,再去进行真实的dom操作,从而完成视图的重新渲染。

有了这个一个中间层,相比于之前不管三七二十一直接根据最新的vnode来渲染视图,性能上肯定是提高了不少。

那么现在,为了进一步提高性能,得想出一个办法,怎么样去最快得找出新旧vnode的不同之处呢?也就是找出相对来说性能较高的diff算法。

在vue2中,使用了双端diff,也就是双指针。具体我就不在这里展开了,大家有兴趣可以去了解了解,我之后也会再写一篇文章聊聊

至此,对于为什么需要虚拟dom,我就已经讲完了。对于网上有些争论,说什么虚拟dom效率跟直接操作真实dom效率要高,我觉得是还没有真正理解到位。越接近底层,性能越好,框架是基于原生js实现的,框架也就是在更上层,性能只能说是无限接近原生js,想超越是不可能。

举个例子:有一个页面,点击某个按钮,需要改变某个元素的文本,你觉得使用框架(vnode)来做,跟不使用框架(vnode)来做,哪个效率更高?

先来看看不使用框架,我们只需要在点击的时候,直接操作真实dom的api即可完成效果。

我们再来看看使用框架,对于框架来说,我们不需要关心如何操作dom了,我们只要点击的时候,给与元素的文本绑定的数据重新赋值即可达到效果,可是,框架的渲染是有一套固定的流程的,首先再对数据重新赋值的时候,框架内部通知了render函数相关的watcher,然后调用了watcher函数的update方法,这里面有把render的运行放入了一个微任务队列,同步代码执行完后,将这个微任务取出来执行,也就是执行我们的render函数,这里面各种创建vnode,最终拿到最新的vnode,这还没完,还需要跟旧vnode进行dom diff,最终找到了就是那个元素的文本需要变化,这时调用真正的dom api完成文本的改变。(以上只是描述了一个大概的渲染流程,没有具体展开了)

通过对比,不用我多说了吧,细品...

相关文章

  • 虚拟DOM(Virtual DOM)的工作原理?

    虚拟DOM(Virtual DOM)的工作原理? 1. 为什么需要虚拟DOM? 先介绍浏览器加载一个网页需要经历那...

  • 2019-11-23

    vue虚拟DOM是什么?vue的虚拟DOM的用法 1、为什么需要虚拟DOM 前面我们从零开始写了一个简单的类Vue...

  • Vue虚拟Dom与diff算法原理

    什么是虚拟DOM? 真实的元素节点: 为什么使用虚拟DOM? 虚拟DOM的作用是什么? 虚拟DOM和真实DOM的区...

  • 第七章 React组件基础

    7-1 React虚拟DOM概念 虚拟DOM的结构,为什么快?如何 实现? 只是对需要变更的模块进行改变,其他都没...

  • 为什么需要虚拟DOM?

    浏览器渲染流程 这个东西,面试会出在哪里呢? 从输入一个url到返回页面的过程发生了什么? 这道题对于我这种憨憨来...

  • 为什么需要虚拟dom?

    对于这个问题,我想说,如果你找到了比虚拟dom更加好的方案,你当然可以直接使用这么一套方案去植入到框架中,来解决框...

  • Vue笔记1

    问:为什么要用虚拟DOM? 答:虚拟DOM其实就是对象,操作对象的成本比操作DOM的成本更低,所以要用虚拟DOM ...

  • vue 2x源码分析(三)---虚拟dom

    以前用jq,我们都是直接操作dom,为什么要使用虚拟dom,虚拟dom的优势是什么,虚拟dom是如何实现的,vue...

  • reactive

    虚拟dom节点 通过javaScript 来虚拟dom 。通过虚拟的dom 来找到那些需要局部跟新的东西,这样可以...

  • 1,v-for:key

    1,为什么v-for需要添加key,优缺点和场景。 前置知识: 虚拟Dom和Diff算法 KeyWords: 虚拟...

网友评论

      本文标题:为什么需要虚拟dom?

      本文链接:https://www.haomeiwen.com/subject/gxbkdrtx.html