采用总—分—总的形式跟大家讲解,如果有出现什么错误,欢迎大家指点

一切从这张大图开始,让我们一步一步来分析:

在new Vue()之后,Vue会调用_init函数进行初始化,也就是这里的init过程,它会初始化生命周期、事件、props、methods、data、computed与watch等

vue在模板编译代码中会执行compileToFunctions将template转化为render函数
const { render, staticRenderFns } = compileToFunctions(template,options//省略}, this); // 将模板编译为render函数
compileToFunctions的主要逻辑如下:
调用parse方法将template转为ast(抽象语法树)
constast = parse(template.trim(), options)
使用正则等方式解析template模板中的指令,class,style等数据,形成ast,这就是with语法的过程
optimize(ast,options)对静态节点做优化
这个过程是深度遍历ast,查看每个子树的节点元素是否为静态节点或者静态根节点,如果是静态节点,那么就做个标记,后面update更新页面的时候,会有个patch的过程,diff算法会直接跳过静态节点,从而减少了比较的过程,优化了patch的性能
generate(ast, options)是将ast转为render funtion字符串的过程,得到render的字符串以及staticRenderFns字符,最后通过new Function(render)生成render函数

vue.js采用数据劫持结合发布者-订阅者模式方法,通过Object.defineProperty()来劫持各个属性的setter,getter。data中声明的属性都被添加了访问器属性,当读取data中的数据时自动调用getter,当修改data中的数据时,自动调用setter方法,并且检测到数据的变化,会通知观察者Watcher,观察者Watcher自动触发重新render当前组件,生成新的虚拟DOM树,Vue框架会遍历对比新虚拟DOM树和旧虚拟DOM树中的每个节点的差异,并记录下来,最后加载操作,将所有记录的不同点,局部修改到真实DOM树上。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Xw9mJSP-1660288620481)(C:\Users\Admin\Desktop\掉头发\前端学习\同CSDN笔记\Vue组件的渲染更新原理知识大连串.assets\20191216164020792-1660288603216.png)]](https://1000bd.com/contentImg/2022/08/15/124747059.png)
最后一步就是借助虚拟DOM,来渲染真正的DOM,具体虚拟DOM中的知识,可以查看此文章 叫人头疼的diff算法
初次渲染过程:
更新过程: