为什么需要虚拟dom?

对于这个问题,我想说,如果你找到了比虚拟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完成文本的改变。(以上只是描述了一个大概的渲染流程,没有具体展开了)

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容