Vue加载过程1.初始化的第一阶段是在创建Vue实例前后,也就是vm对象:首先,Vue执行生命周期,然后事件初始化发生在beforeCreate生命周期函数之前,然后处理数据。监控和数据代理的初始化就是创建vm对象的过程。当创建vm对象时,可以通过vm对象访问被劫持的数据,比如数据中的数据,方法中的方法等。然后Vue调用内部render函数开始解析模板,解析成JS对象,即在内存中生成一个虚拟DOM,也就是一个Vnode对象。第二个阶段是vm对象挂载前后:在挂载完成之前,页面呈现的是未经Vue编译的DOM结构,所有对DOM的操作最终都不会生效。在挂载之前,先将内存中的Vnode转化为真实的DOM并插入页面,此时挂载完成。页面上呈现的是Vue编译好的DOM结构,初始化过程就结束了。2、开通订阅消息是数据劫持代理监控。其实就是写一个watcher函数来监听数据变化,发送网络请求,绑定自定义事件等初始化操作。当数据发生变化,即状态发生变化时,会重构一个新的Vnode对象。然后比较新的Vnode对象和旧的Vnode对象的差异,也就是DIFF算法,然后将差异应用到旧的Vnode对象构建的真实DOM树上。这个过程是打补丁的,更新视图。加载每个组件每当调用Vue内部的render函数时,都会将组件的tamplate选项的模板解析为JS对象。该对象与DOM节点对象具有相同的结构,然后数据劫持代理监听。当数据变化时,旧的Vnode对象和生成的新的Vnode对象比较差异,然后更新DOMVnode:{tag:"",id:,name:"Box",$el:上DOM的引用真实页面,//等等。attributechiren:[{tag:"",id:,name:"Box2",$el:真实页面DOM的引用,//其他属性},{tag:"",id:,name:"Box3",$el:真实页面上的DOMReferences,//etc.attributes}]}什么是DIFFdiff算法是一种比较算法。比较旧的虚拟DOM和新的虚拟DOM,比较哪个虚拟节点发生了变化,找出这个虚拟节点,只更新这个虚拟节点对应的真实节点,而不更新其他数据没有变化的节点。准确更新真实DOM,提高效率。它有两个特点:只会在同一层进行比较,不会跨层比较。改变时,subscriberwatcher会调用patch对真实DOM打补丁,通过isSameVnode进行判断。如果相同,则调用patchVnode方法。patchVnode做了以下操作:找到对应的真实dom,称为el。等于,设置el文本节点为Vnode的文本节点如果oldVnode有子节点而VNode没有,则删除el子节点如果oldVnode没有子节点但VNode有,则实现后将VNode的子节点添加到el如果都有子节点,则执行updateChildren函数,比较子节点中间在一个循环中,调用patchVnode重复打补丁的过程,调用createElem创建一个新节点,从哈希表中寻找key相同的VNode节点,然后根据情况划分操作参考前面-end高级面试题详解关于Vue中el、template、render、$mount的渲染渲染根节点:首先判断是否有el属性,有则直接获取el根节点,没有则调用$亩nt获取根节点。Renderingtemplate:Yesrender:此时先执行render函数,renderpriority>template。无渲染:有模板时,使用模板解析成render函数需要的格式,使用render函数进行渲染。当没有模板时,使用el根节点的outerHTML解析成render函数需要的格式,使用调用render函数的方式进行渲染:无论什么情况,最终的uniform就是使用要渲染的渲染函数
