new Vue 都干了什么?
import Vue from 'vue'
new Vue({
render: h => h(App)
}).$mount('#app')
- 找到Vue的源码,
src/core/instance/index.js
function Vue (options) {
...
this._init(options)
}
- 原来如此调用了一个
_init方法啊,虽然我并不知道他是干嘛的,那就研究一下吧,只过大体流程,不然会越陷越深。 打开src/core/init.js
Vue.prototype._init = function (options) {
const vm = this
if (options && options._isComponent) {
initInternalComponent(vm, options)
} else {
vm.$options = mergeOptions(
resolveConstructorOptions(vm.constructor),
options || {},
vm
)
}
initLifycycle(vm)
initEvents(vm)
initRender(vm)
callHook(vm, 'beforeCreate')
initInjections(vm)
initState(vm)
initProvide(vm)
callHook(vm, 'created')
...
vm.$mount(vm.$options.el)
}
上面是精简代码,其实_init做的事情还是蛮多的,能做的都做了,我们只看主流程,细化的先不看,定义vm变量存储Vue实例,判断options中是否存在_isComponent属性,如果存在执行initInternalComponent, 这个函数干嘛的不管。
继续看,这时候有个疑问isComponent是不是就是指他是组件实例呢?答案是的。
那else就是说是根实例的操作了,巧了,看的就是你啊。我们看到在vm上定义了一个$options属性,然后执行mergeOptions方法,将返回值赋值给vm.$options,这时候我猜测,应该是将vm.constructor上的属性与options中的属性合并了,mergeOptions我们后面分析,还是那句话,看主流程,知道自己要看的是啥,看完主流程,在有目的的去看其他的。
合并完属性之后,就是一系列的初始化操作,各种init啊,同时还在中间插了两个生命周期的钩子,根据这个init的命名,我们大概能猜到是这些东西, 初始化生命周期、初始化事件、初始化render、beforeCreate、初始化inject、初始化state(props、computed、data、methods、watch)、初始化provide,created。
这样我们就大概知道了,原来生命周期breforeCreate之前初始化了这些东西, created之前初始化了这些东西,所以我们在created中就可以调用到data中的属性、methods中的方法、computed中的属性等。
最后在调用一个$mount完事。
总结
new Vue()做的事
- 合并options
- 初始化生命周期、事件、render、beforeCreate、inject、props、methods、data、computed、watch、provide、created。
- 调用$mount
疑问
- mergeOptions
- 一系列的初始化过程是怎么样的?
- $mount都干了啥?