在Vue项目中,我们会在入口文件main.js里面 import Vue fom 'vue'
那么Vue到底是怎么初始化的?
主要关键源码在src/core/index.js下,主要两个比较关键的代码:
1. import Vue from './instance/index',初始化Vue
2. initGlobalApi(Vue),扩展全局的静态方法Api
Vue 的定义
/src/core/instance/init.js
// 1. 合并了组件的配置项挂载到全局 vm.$options 上,初始化组件实例关系属性, $parent、$children、$root、$refs 等等(initLifecycle(vm))
// 2.自定义事件的监听,谁注册、谁监听(initEvents(vm))
// 3.插槽和渲染函数,同时定义了组件 attrs 和 $listeners属性。
插槽信息:vm.$slot
渲染函数:vm.$createElement (创建元素)(即render函数)
(initRender(vm))
// 4.触发 beforeCreate 钩子函数(callHook(vm,‘beforeCreate’))
// 5.初始化 inject 配置项(initInjections(vm))
// 6.初始化响应式数据,如 props, methods, data, computed, watch(initState(vm))
初始化顺序:props(initProps()) > methods (iniitMethods()) > data(initData()) > computed(initComputed()) > watch(initWatch())
执行顺序: computed > watch,触发方法时:methods > watch
// 7.初始化解析 provide(initProvide(vm))
// 8.触发 created 钩子函数(callHook(vm, 'created'))
Tip1: Vue 的初始化过程?
答: Vue实际上是一个用Function实现的类,通过调用this._init方法,进行初始化,即beforeCreate钩子函数和created钩子函数前执行的内容,具体如下:Tip2: beforeCreate 钩子函数前完成了什么?
答:beforeCreate之前,主要是在处理vm实例上的各种属性配置和自定义事件属性。具体:首先合并了组件的配置项挂载到全局vm.$options上。初始化组件实例关系属性:$parent、$children、$root、$refs等等;初始化自定义事件监听;最后初始化组件插槽,作用域插槽,render函数等(createElement),同时定义了组件$attr、$listeners属性Tip3: created 钩子函数前完成了什么?
答:首先初始化好inject配置项,再初始化各种响应式数据和方法如:props、methods、data、computed、watch,最后初始化provided配置项(vm.provided)。Tip4:初始化函数initInjections(vm)、 initState(vm) 、initProvide(vm) 顺序是不可变化的:inject配置项是注入数据,在后续的computed、data中有可能会用到inject的数据,proive配置项是解析数据,需要等待响应式数据和方法初始化完成后执行,所以顺序不能变。
Why:
为什么Vue不用class在一个模块实现所有方法,通过函数实现类,Vue按功能分模块管理,非常方便代码的维护和管理。