Vue.createApp到底做了什么?
当调用Vue.createApp时实际上会来到下面这个函数
export const createApp = ((...args) => {
const app = ensureRenderer().createApp(...args)
const { mount } = app
app.mount = () => {
}
return app
})
ensureRenderer函数
let renderer
function ensureRenderer() {
return (
renderer ||
(renderer = createRenderer(rendererOptions))
)
}
createRenderer函数
export function createRenderer(options) {
return baseCreateRenderer(options)
}
baseCreateRenderer函数
function baseCreateRenderer(options, createHydrationFns){
const render = (vnode, container, isSVG) => {
if (vnode == null) {
if (container._vnode) {
unmount(container._vnode, null, null, true)
}
} else {
patch(container._vnode || null, vnode, container, null, null, null, isSVG)
}
flushPostFlushCbs()
container._vnode = vnode
}
return {
render,
hydrate,
createApp: createAppAPI(render, hydrate)
}
}
createAppAPI函数
export function createAppAPI(render, hydrate) {
return function createApp(rootComponent, rootProps = null) {
if (rootProps != null && !isObject(rootProps)) {
}
const context = createAppContext()
const installedPlugins = new Set()
let isMounted = false
const app = (context.app = {
_uid: uid++,
_component: rootComponent,
_props: rootProps,
_container: null,
_context: context,
_instance: null,
version,
get config() {
return context.config
},
set config(v) {
},
use(plugin, ...options) {
return app
},
mixin(mixin) {
return app
},
component(name, component) {
return app
},
directive(name, directive) {
return app
},
mount(rootContainer, isHydrate, isSVG) {
},
unmount() {
},
provide(key, value) {
return app
}
})
return app
}
}
总结
- 调用Vue.createApp时,会先调用ensureRenderer函数,该函数是为了确保有渲染器。
- 如果没有渲染器,那么ensureRenderer函数会调用createRenderer函数,创建一个渲染器。
- createRenderer函数内部调用了baseCreateRenderer函数,该函数才是真正创建渲染器的函数。在这个函数会返回一个渲染器对象,该对象有render函数和createApp函数。
- 有了渲染器对象,就会开始调用渲染器对象上的createApp函数,这个函数就是真正创建app对象的函数。
- 在渲染器对象上的createApp函数中,创建了app对象,并给该对象添加了use,mount,mixin,component,directive,unmount,provide等方法。同时还会创建一个app上下文(context)和app对象互相引用,还创建了isMounted变量,用来记录是否被挂载过。
其他vue3源码阅读笔记