前沿技术解密——VirtualDOM

作为React的核心技术之一Virtual DOM,一直披着神秘的面纱。

实际上,Virtual DOM包含:

  1. Javascript DOM模型树(VTree),类似文档节点树(DOM)
  2. DOM模型树转节点树方法(VTree -> DOM)
  3. 两个DOM模型树的差异算法(diff(VTree, VTree) -> PatchObject)
  4. 根据差异操作节点方法(patch(DOMNode, PatchObject) -> DOMNode)

接下来我们分别探讨这几个部分:

VTree

VTree模型非常简单,基本结构如下:

{
    // tag的名字
    tagName: ‘p‘,
    // 节点包含属性
    properties: {
        style: {
            color: ‘#fff‘
        }
    },
    // 子节点
    children: [],
    // 该节点的唯一表示,后面会讲有啥用
    key: 1
}

所以我们很容易写一个方法来创建这种树状结构,例如React是这么创建的:

// 创建一个div
react.createElement(‘div‘, null, [
    // 子节点img
    react.createElement(‘img‘, { src: "avatar.png", class: "profile" }),
    // 子节点h3
    react.createElement(‘h3‘, null, [[user.firstName, user.lastName].join(‘ ‘)])
]);

VTree -> DOM

这方法也不太难,我们实现一个简单的:

function create(vds, parent) {
  // 首先看看是不是数组,如果不是数组统一成数组
  !Array.isArray(vds) && (vds = [vds]);
  //  如果没有父元素则创建个fragment来当父元素
  parent = parent || document.createDocumentFragment();
  var node;
  // 遍历所有VNode
  vds.forEach(function (vd) {
    // 如果VNode是文字节点
    if (isText(vd)) {
      // 创建文字节点
      node = document.createTextNode(vd.text);
    // 否则是元素
    } else {
      // 创建元素
      node = document.createElement(vd.tag);
    }
    // 将元素塞入父容器
    parent.appendChild(node);
    // 看看有没有子VNode,有孩子则处理孩子VNode
    vd.children && vd.children.length &&
      create(vd.children, node);

    // 看看有没有属性,有则处理属性
    vd.properties &&
      setProps({ style: {} }, vd.properties, node);
  });
  return parent;
}

diff(VTree, VTree) -> PatchObject

差异算法是Virtual DOM的核心,实际上该差异算法是个取巧算法(当然你不能指望用O(n^3)的复杂度来解决两个树的差异问题吧),不过能解决Web的大部分问题。

那么React是如何取巧的呢?

  1. 分层对比

如图,React仅仅对同一层的节点尝试匹配,因为实际上,Web中不太可能把一个Component在不同层中移动。

  1. 基于key来匹配

还记得之前在VTree中的属性有一个叫key的东东么?这个是一个VNode的唯一识别,用于对两个不同的VTree中的VNode做匹配的。

这也很好理解,因为我们经常会在Web遇到拥有唯一识别的Component(例如课程卡片、用户卡片等等)的不同排列问题。

  1. 基于自定义元素做优化

React提供自定义元素,所以匹配更加简单。

patch(DOMNode, PatchObject) -> DOMNode

由于diff操作已经找出两个VTree不同的地方,只要根据计算出来的结果,我们就可以对DOM的进行差异渲染。

扩展阅读

具体可参考下面两份代码实现:

  1. @Matt-Esch实现的:virtual-dom
  2. 我们自己做的简版实现,用于Mobile页面渲染的:qvd
时间: 2024-10-10 11:01:48

前沿技术解密——VirtualDOM的相关文章

十年京东,十年技术发展—畅读《京东技术解密》

<京东技术解密>试读章节共71页,我花了两天时间仔细读完,读了过后感到意犹未尽,非常想一口气把整本读完,然而只能将试读章节反复读了好几遍,收获颇多,遂有此文,借此总结京东十年来的技术变迁和迅速发展. 之所以对这本书感兴趣基于两个原因:一是自己最近刚好在读一本书<不战斗不成功:刘强东和京东商城的"野蛮"奋斗史>,见识到了刘强东本人丰富的创业经历,与当当网拼图书.与淘宝网拼百货.与苏宁易购拼家电,京东真是什么都卖,这份处处竞争的心也值得佩服.二是自己一直对京东印象不

京东手机商品详情页技术解密

京东手机商品详情页技术解密 作者:陈保安,2011年加入京东,目前主要负责手机京东核心业务(搜索.商品.购物车.结算.收银台.我的京东)的后端研发工作.带领团队在一线奋战多年,积累了非常丰富的大促备战经验,也见证了核心系统从一分钟几千单到几十万单的质的蜕变. 京东手机单品页在每次大促时承载所有流量的入口,它被天然赋予的一个标签就是抗压,对系统的稳定性.性能方面要求极其苛刻,另外单品页本身业务复杂度较高,单品页有几十种垂直流程业务,并且展示上都要求个性化的单品页,加上依赖有50+的基础服务,稍有抖

数据隐藏技术解密

数据隐藏技术解密 破解多媒体.操作系统.移动设备和网络协议中的隐秘数据 概述 决心每天花点时间,一个星期看完整本书.起初,有自己亲身验证课本中所涉及所有实例,由于时间原因,加之我认为课本中涉及到的工具都是会过时的,只有思想以及方法技术是可以较长时间指导人们工作的,就来思想和技术都有可能会被替代,但在某种意义上说其可以在较长一段时间内产生异响.人的精力和时间都是有限的,因此对本书我选择通读全文,中间基本不加实践,主要是体会其思想和技术要点. 看书过程中给了我这样一个感觉,基本上全书都在讨论工具的使

《京东技术解密》读后感

注:本文仅为作者的读后感 <京东技术解密>这本书想必园子里的朋友有读过的,也有未曾听说过的.当我第一次拿到这本书的时候,我一直以为是一本纯技术类的讲解,后来才知道我真的是太天真了,这本书向<淘宝技术这十年>这类书差不多,公司成长和发展的心路历程罢了.那么我又为什么拿出来分享呢?我是怎样读下来的呢,其实这本书中有很多内容是我们可以学习和借鉴的. 整本图书从外观看上去非常的简洁,和京东的购物手提袋类似,充分体现了京东的风格.书的整部分由 618.产品演进.技术演进.创新.牛人几个方面全

《京东技术解密》读书笔记:坚持技术十年如一日

内容目录: 1.京东技术升级路线 2.京东创新的应用 3.京东那些技术牛人 一直在京东上面shopping,喜欢京东的物流,也有一些同学在京东研发体系上班了,早就听说有了这么一本书,却一直没有阅读.最近,从京东上购买了一本,花了几天的业余时间畅读一番.刘强东在书中的序言中写了一段话,很好地说明了这本书的背景: “京东可以高速发展到今天的规模的原因,其中最核心的是坚持“倒三角”战略:建立出色的团队:打造财务.物流和技术三大核心系统:降低成本.提升效率:为用户带来最佳体验.在<京东技术解密>一书中

亿级商品详情页架构演进技术解密 | 高可用架构系列

亿级商品详情页架构演进技术解密 | 高可用架构系列 --http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=210272034&idx=1&sn=3be9d2b53c7fec88716ee8affd2515f8&scene=1&srcid=UfXZNNOVZZyZjQmp0VOh&from=groupmessage&isappinstalled=0#rd 此文是开涛在[三体高可用架构群]之分享内容

共享单车玩前沿技术?或许这是活命之本

对于共享单车行业而言,目前实在是多事之秋.当然,有喜也有悲.既有近段时间摩拜.ofo先后获得数亿美元融资,让共享单车行业扬眉吐气的喜事,也有单车乱停乱放,甚至成为环境潜在威胁这样的悲事.而如今,似乎共享单车企业又和前沿技术杠上了. 摩拜.ofo等共享单车企业纷纷发布全新单车相关技术,让人眼前一亮.而众多前沿技术的落地和使用,意味着共享单车行业要从此前的比拼投放量向提升使用体验等方向进化.或许在接下来,前沿技术将是共享单车企业的"活命之本". 为前沿技术"疯魔"!摩拜

读《京东技术解密》,感“桑田沧海变迁”

前言:读完<京东技术解密>的试读章节,情不自禁叹了口气,不仅仅感叹文章带给我的震撼,更感叹我们的团队在未来能取得怎样的成就.书中提及的京东技术架构以及成长史,足够的牛气,足够的辉煌,然而其10年来的辛酸背后,都体现了我们挨踢人对于互联网狂热的追求.对于编程改变生活的憧憬. 推荐序之一.二 1.从奶茶妹妹的夫君刘先生的序言中看出,京东从起初的4人团队成长到现在的4000人团队,京东技术团队的努力奠定了京东如今的商业巨头的地位.而结合我们自身而言,今年年初加入到我现在的公司,研发部的团队成员也有最

【震撼】《京东技术解密》获众大神集体推荐,4千人10年经验一次放送

<京东技术解密>新书发布会今天在国家会议中心举行.来自京东的多位高管,以及这本新书的写作编辑团队,出版社负责人一起在现场揭开了这本书的神秘面纱,并且集体向业界重磅推荐这本凝结了京东作为互联网行业的技术领先者十年深厚的技术积累. 这是一个技术团队从30人成长为4000人,一家公司从创业到成功IPO,所走过的路,所积累的经验. “这本书太厚,把京东核心的技术都暴露了”——京东研发高级副总裁 李大学 “这本书太薄,每一个章节的技术我们都有写成一本书的丰富积累”——京东集团副总裁 马松 “纠缠式约稿完