vue2原理

56 阅读1分钟

image.png

1.响应式原理

Object.defineProperty()

2.依赖收集原理

getter的时候会去收集依赖,把对应的watcher实例添加到Dep的subs中去, setter的时候,会触发Dep的notify方法,执行Watcher里面的update更新

3.模版编译

模版编辑经历三个阶段:

  1. parse使用正则处理模版中的变量、指令等,转化成AST
  2. optimise进行静态节点标记,是为了虚拟dom对比的过程中,如果是静态节点会忽略,提高更新效率
  3. generate 转成render function

4.diff算法

更新的时候会产生新的VNode,会和之前旧的VNode进行对比,进行patch, 找到新旧VNode的差异,将差异更新到页面上 对比是同层对比,

  1. 如果老节点不存在,直接插入新节点,如果新节点不存在,直接删除老节点
  2. 新老节点同时存在,先对比是不是相同节点,通过tag、key、comment、data等
    2.1. 如果是相同节点,则进行patchVnode 过程中涉及到一个新老节点都存在,且不是静态节点,会执行updateChildren方法,涉及到双端对比,头对头,尾对尾,头对尾,尾对头
    2.2. 如果不是相同节点,则直接删除老节点,增加新节点

5.nextTick原理

由于目前浏览器没有实现nextTick方法,所有vue.js源码中使用Promise、setTimeout、setImmediate等方式在microtask中创建了一个事件,目的是在当前执行栈执行完成后再去执行这个事件

6.vuex原理

Vue.use(vuex) vuex内部提供install方法,并用Vue.mixin方法将vuexInit混进beforeCreate钩子中,通过options中的store是否存在,判断是否是根节点,将this.options中的store是否存在,判断是否是根节点,将this.store挂载到根节点上,这样每个实例都能够通过this.$store访问到Store实例了