Vue 源码学习

1. Vue 的本质

runtime-only 版的 vue.js 的构建入口文件是 src/platforms/web/entry-runtime.js,runtime + compile 版的 vue.js 的构建入口文件是 src/platforms/web/entry-runtime-with-compile.js。在文件中顺着 Vue 的引入层层往上找,就会找到定义 Vue 的文件,src/core/instance/index.js。Vue 的定义如下:

import { initMixin } from './init'
import { stateMixin } from './state'
import { renderMixin } from './render'
import { eventsMixin } from './events'
import { lifecycleMixin } from './lifecycle'
import { warn } from '../util/index'

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)
}

initMixin(Vue)
stateMixin(Vue)
eventsMixin(Vue)
lifecycleMixin(Vue)
renderMixin(Vue)

export default Vue

Vue 就是一个用 function 实现的类,通过 new Vue 去实例化它。用函数的方式定义类而不是用 es6 的 class 方法,是因为下面会有一些函数(如上),他们会在 Vue 的 prototype 上扩展一些方法。Vue 按功能把这些扩展分散到多个模块(文件)中去实现,非常方便代码的维护和管理,但是这样用 class 是很难实现的,因此使用了函数的定义。

2. new Vue 的时候发生了什么

从上面 Vue 类的定义看到,new 一个实例时会调用 this._init 方法,这个方法是通过 inITMixin(Vue) 挂在到 Vue 原型上的,代码在 src/core/instance/init.js