2.Vue初始化过程
Vue
/src/core/instance/index.js
1 |
|
vue 初始化时调用了 initMixin,为其绑定了 vue.prototype._init
在 new Vue(options) 时,会调用 Vue.prototype._init(options)
Vue.prototype._init
/src/core/instance/init.js
1 |
|
初始化过程做了什么
- 处理组件配置项
- 初始化根组件时进行了选项合并操作,将全局配置合并到根组件的局部配置上
- mergeOptions
- resolveConstructorOptions
- 初始化每个子组件时做了一些性能优化,将组件配置对象上的一些深层次属性放到 vm.$options 选项中,以提高代码的执行效率
- initInternalComponent
- 初始化根组件时进行了选项合并操作,将全局配置合并到根组件的局部配置上
- 初始化组件实例的关系属性,比如 $parent、$children、$root、$refs 等
- initLifecycle
- 处理自定义事件
- initEvents
- 调用 beforeCreate 钩子函数
- callHook(vm, ‘beforeCreate’)
- 初始化组件的 inject 配置项,得到
ret[key] = val
形式的配置对象,然后对该配置对象进行浅层的响应式处理(只处理了对象第一层数据),并代理每个 key 到 vm 实例上- initInjections(vm)
- 数据响应式,处理 props、methods、data、computed、watch 等选项
- initState(vm)
- 解析组件配置项上的 provide 对象,将其挂载到 vm._provided 属性上
- initProvide(vm)
- 调用 created 钩子函数
- callHook(vm, ‘created’)
- 如果发现配置项上有 el 选项,则自动调用 $mount 方法,也就是说有了 el 选项,就不需要再手动调用 $mount 方法,反之,没提供 el 选项则必须调用 $mount
- 接下来则进入挂载阶段
源码层面解释面试题
- beforeCreate 时有数据响应式吗?
从源码上来看,在 vue 初始化时,会首先调用已经在 initMixin 时绑定在 vue 原型上的 _init 方法,在 _init 函数中,会按顺序执行很多个初始化函数以及生命周期调用函数,而 initState 是写在 callHook(vm, ‘beforeCreate’) 后面的,所以 beforeCreate 时还没有数据响应式。
参考
2.Vue初始化过程
http://example.com/2022/10/21/2-Vue初始化过程/