我的学习历程(一)——整体初始化流程
2019-10-07 本文已影响0人
Shiki_思清
在编写vue代码时,必然会用到vue的初始化流程,如下:
var app = new Vue({
el: #app,
template: '<App></App>',
render: h => h(App)
data: {},
components: {}
}).$mount('#app')
那么问题来了,
- 上面的每个参数起什么作用呢?
- 各个参数对应vue哪个生命周期?
1、初始化所有方法,并绑定到vue.propertype上面。(即顺序执行如下方法 ---> 执行结果)
1、core/instance/index.js
initMixin(Vue)--->Vue.prototype._init()stateMixin(Vue)--->Vue.prototype.$data,Vue.prototype.$props,Vue.prototype.$set(), Vue.prototype.$delete(), Vue.prototype.$watch()eventsMixin(Vue)--->Vue.prototype.$on,Vue.prototype.$emitlifecycleMixin(Vue)--->Vue.prototype._update(), Vue.prototype.$forceUpdate(), Vue.prototype.$destroyrenderMixin(Vue)--->Vue.prototype.$nextTick(),Vue.prototype._render()
2、core/index.js
initGlobalAPI(Vue)--->Vue.config,Vue.set, Vue.delete, Vue.nextTick,Vue.observable,Vue.options.components, Vue.options.filters, Vue.options.directives,
initUse(Vue)--->Vue.use()initMixin(Vue)--->Vue.mixin()initExtend(Vue)--->Vue.extend()initAssetRegisters(Vue)--->Vue.components(), Vue.filters(), Vue.directives()
2、执行_init()方法, 初始化全部(包括data, method, 生命周期中)定义的方法,并挂载到vm对象上
1、core/instance/index.js
this._init(options)--->vm._uid, vm._isVue, vm.$options, vm._renderProxy, vm._self
initLifecycle(vm)--->vm.$parent, vm.$root, vm.$children, vm.$refs, vm._watcher, vm._inactive, vm._directInactive, vm._isMounted, vm._isDestroyed, vm._isBeingDestroyedinitEvents(vm)--->vm._events, vm._hasHookEvent事件监听初始化initRender(vm)--->定义vm._vnode, vm._staticTrees, vm.$slots, vm.$scopedSlots,vm._c(), vm.$createElement(),vm.$attrs, vm.$listenerscallHook(vm, 'beforeCreate')--->执行beforeCreate里面定义初始化的方法initInjections(vm)--->获取注入数据并做响应化initState(vm)
initProps(vm, opts.props)--->将初始化时定义的props绑定给vminitMethods(vm, opts.methods)--->将初始化时定义的方法绑定给vminitComputed(vm, opts.computed)--->绑定在监控对象上initWatch(vm, opts.watch)--->绑定在vm.$watch上
initProvide(vm)--->将初始化时注入的数据绑定在vm._providedcallHook(vm, 'created')--->执行created里面定义初始化的方法
3、执行mountComponent() , 为挂载做最后准备
1、platforms/web/entry-runtime-with-compiler.js
执行Vue.prototype.$mount(此时Vue为runtime/index下)---> 得到render, template,el, 执行优先级为render > template > el, 并且在template中,可以传并确认优先级为字符串模板 > dom树- 执行
compileToFunctions(),得到render函数, 将其挂在vm.$options上
2、platforms/web/runtime/index.js
执行Vue.prototype.$mount(此时Vue为core/index下)
mountComponent(this, el, hydrating)--->vm.$el = el, callHook(vm, 'beforeMount'), vm._update(vm._render(), hydrating), vm._isMounted = true, callHook(vm, 'mounted')return vm
4、完成挂载app.$mount('.app')
1、platforms/web/entry-runtime-with-compiler.js
mount.call(vm, el, hydrating), 将上面的vm对象和el参数传给mount方法,也就是的Vue.prototype.$mount方法
最后,主要的初始化流程大概就是这些,还有很多未写进去的初始化相关代码模块,比如component.js,factory.js等等,过于庞大,不再做深入研究