You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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 源码分析(构造函数)
寻找构造函数
我们知道 Vue 通过 new Vue 开始的,Vue 是一个构造函数。
Vue 的入口是在 src/platforms/web/entry-runtime-with-compiler.js ,在文件的最后导出 Vue
其中 Vue 又是通过 import Vue from './runtime/index' 导入的。
在 ./runtime/index 也是通过 import Vue from 'core/index' 导入的,继续在 /core/index 寻找,最终是在 ./instance/index 定义的
Vue 本身很简单,调用自身 _init 函数。
构造函数属性和方法
从入口文件到最终定义 Vue 的文件中,在构造函数 Vue 上添加了很多属性和方法。在这里不探究具体作用,知道添加了哪些。
在 src/platforms/web/entry-runtime-with-compiler.js 添加了
在 runtime/index.js
在 core/index.js
首先通过 Object.defineProperty 在 Vue 添加 FunctionalRenderContext,以及在 Vue.prototype 添加 $ssrContext、$isServer
通过 initGlobalAPI 函数初始化全局 API
在 Vue 上添加 config,Object.defineProperty(Vue, 'config', configDef)
在 Vue 上添加 util
添加三个重要的 API:
添加 observable
添加 options 对象,并在 options 对象上初始化 components 、directives、filters 为空对象
在 Vue.options 添加 _base
在 Vue.options.components 上添加 KeepAlive
最后通过四个函数添加了重要的四个全局 API
在 core/instance/index
通过 initMixin 函数添加 _init 函数,这就就是 Vue 构造函数调用的 _init
通过 stateMixin 函数在 Vue.prototype 添加 $data、$props、$set、$delete、$watch
通过 eventsMixin 函数在 Vue.prototype 添加关于事件的方法:$on、$once、$off、$emit
通过 lifecycleMixin 函数在 Vue.prototype 添加生命周期的方法:_update、$forceUpdate、$destroy
通过 renderMixin 函数在 Vue.prototype 添加渲染相关方法:$nextTick、_render ,在 renderMixin 函数中还调用了 installRenderHelpers 函数
Vue 前期准备工作和初始化已经完成
The text was updated successfully, but these errors were encountered: