vue源码学习总结

68 阅读1分钟

最近公司没有任务做,开始了摸鱼,顺便看了一下vue2的源码,这次不是直接看代码,而是一个源码的教程,这个教程是概况了核心和总结了一下vue的主要核心。教程链接:ustbhuangyi.github.io/vue-analysi…

vue2的源码我整体上在这上面过了一遍,总结出以下几个核心:

数据驱动

所谓数据驱动就是通过改变数据改变视图,不在需要操作dom节点。

var app = new Vue({
  el: '#app',
  data: {
    message: 'Hello Vue!'
  }
})
function Vue (options) {
  if (process.env.NODE_ENV !== 'production' &&
    !(this instanceof Vue)
  ) {
    warn('Vue is a constructor and should be called with the `new` keyword')
  }
  this._init(options)
}
  if (vm.$options.el) {
    vm.$mount(vm.$options.el)
  }

new Vue 的时候,我们会传入一个对象,Vue构造函数接受一个option参数,并执行_init,_init我这里就不展开了,详情去文档看吧。 大概的逻辑就是_init里面做了一些option属性的初始化,每一个函数都有相应的函数去初始化,最后通过$mount挂载到el上面。

Vue.prototype.$mount = function (
  el?: string | Element,
  hydrating?: boolean
): Component {
  el = el && inBrowser ? query(el) : undefined
  return mountComponent(this, el, hydrating)
}

然后看看$mount做了什么,其实是调用了mountComponent

  new Watcher(vm, updateComponent, noop, {
    before () {
      if (vm._isMounted) {
        callHook(vm, 'beforeUpdate')
      }
    }
  }, true /* isRenderWatcher */)

这是mountComponent中的代码片段,mountComponent的核心就是new了个Watcher实例,Watcher顾名思义就是监听者,但是他监听了什么呢,我这里暂时不做分析。Watcher 在这里起到两个作用,一个是初始化的时候会执行回调函数,另一个是当 vm 实例中的监测的数据发生变化的时候执行回调函数

  updateComponent = () => {
      vm._update(vm._render(), hydrating)
    }
vm.$el = vm.__patch__(vm.$el, vnode, hydrating, false /* removeOnly */)

updateComponent这里执行vm._update,_update里面就会调用 vm.patch,vm.patch 就是通过一系列的算法对新旧节点进行更新。 还有vm._render就是我们render函数底层的方法,在这里创建新的VNode。

最后我把渲染流程图放上来:

本人第一次在此平台发博客,请大佬们讨论留言,谢谢。