美文网首页程序员
基于Vue认识虚拟DOM(Virtual DOM)

基于Vue认识虚拟DOM(Virtual DOM)

作者: 雪燃归来 | 来源:发表于2020-06-17 11:01 被阅读0次

       Virtual DOM这个概念相信大家不会太陌生,他产生的前提是浏览器中的DOM是很“昂贵”的,为了直观的感受,我们可以把一个简单的div元素属性都打印出来,如下图所示:

<div id="content"></div>
  <script>
    var div = document.createElement('div')
    var str = ''
    for(var key in div){
      str += key + ' '
    }
    content.innerHTML = str
  </script>
浏览器中DOM
       可以看到,真正的DOM元素是非常庞大的,因为浏览器的标准就是把DOM设计的非常复杂。当我们频繁地去做DOM更新,会产生一定的性能问题。
       而Virtual DOM就是用一个原生的JS对象去描述一个DOM节点,所以它比创建一个DOM的代价要小的多。在vue.js中,Virtual DOM是用VNode这么一个Class去描述,它是定义在 src/core/vdom/vnode.js中的。
var VNode = function VNode (
    tag,
    data,
    children,
    text,
    elm,
    context,
    componentOptions,
    asyncFactory
  ) {
    this.tag = tag;
    this.data = data;
    this.children = children;
    this.text = text;
    this.elm = elm;
    this.ns = undefined;
    this.context = context;
    this.fnContext = undefined;
    this.fnOptions = undefined;
    this.fnScopeId = undefined;
    this.key = data && data.key;
    this.componentOptions = componentOptions;
    this.componentInstance = undefined;
    this.parent = undefined;
    this.raw = false;
    this.isStatic = false;
    this.isRootInsert = true;
    this.isComment = false;
    this.isCloned = false;
    this.isOnce = false;
    this.asyncFactory = asyncFactory;
    this.asyncMeta = undefined;
    this.isAsyncPlaceholder = false;
  };

       可以看到Vue.js中的Virtual DOM还是稍微有点复杂的。因为他这里包含了很多Vue.js的特性。这里千万不要被这茫茫多的属性吓到,实际上Vue.js中Virtual DOM是借鉴了一个开源库snabbdom的实现,然后加入了一些Vue.js特色的东西。
       其实VNode是对真实DOM的一种抽象描述,它的核心定义为非就几个关键属性,标签名,数据,子节点,键值等,其他属性都是用来扩展VNode的灵活性以及实现一些特殊的feature的。由于VNode只是用来用来映射到真实DOM的渲染,不需要包含操作DOM的方法,因此它就非常轻量和简单。
       Virtual DOM除了它的数据结构的定义,映射到真实的DOM实际上要经历VNode的 create、diff 、patch等过程。
       下面是vue.js从初始化到最终渲染的整个过程。假如你想阅读Vue源码,这张图应该能够帮到你。

vue.js从初始化到最终渲染的整个过程

相关文章

网友评论

    本文标题:基于Vue认识虚拟DOM(Virtual DOM)

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