vue3源码阅读【packages\runtime-dom\src\index.ts】【createApp】

本文详细介绍了Vue应用创建过程,包括`createApp`、`renderer`的初始化和复用,以及`createRenderer`、`createAppAPI`等关键函数的作用。通过`ensureRenderer`确保渲染器的创建和利用,`createAppAPI`利用函数科里化实现组件挂载的定制。同时,文章探讨了`mount`方法的重写和上下文对象的创建,揭示了Vue框架内部的工作原理。
摘要由CSDN通过智能技术生成

createApp

  • 首先会在js文件下定义一个变量 renderer 用于存储初始化的 Renderer 对象,
  • renderer || createRenderer() 这种用法可以保证 renderer 创建后重复利用。
  • ensureRenderer:之所以将 renderer 初始化的功能重新定义一个方法,有利于在 render 函数和 createApp 函数多次调用
  • rendererOptions:创建 renderer 对象的配置参数来源于 patchProp 和 nodeOps
  • baseCreateRenderer:返回带有 render 和 createApp 等 的一个对象
  • createAppAPI:这里利用了函数科里化的思想,属于闭包的一种,执行 createAppAPI 获取参数 render 等,然后直接返回函数 createApp ,在执行 createApp 时 接收参数 rootComponent 。
  • createAppContext:执行createAppContext 获取contenxt对象,然后设置app._context= contenxt并返回app对象。
  • getGlobalThis: getGlobalThis
  • createApp: 执行完成后会重写 app.mount 并返回app对象

let renderer: Renderer<Element | ShadowRoot> | HydrationRenderer

...
export const createApp = ((...args) => {
  const app = ensureRenderer().createApp(...args)
...
  const { mount } = app
    app.mount = (containerOrSelector: Element | ShadowRoot | string): any => {
    ...
    return app
    }
...
...
function ensureRenderer() {
  return (
    renderer ||
    (renderer = createRenderer<Node, Element | ShadowRoot>(rendererOptions))
  )
}
...
const rendererOptions = /*#__PURE__*/ extend({ patchProp }, nodeOps)
 
...
...
export function createRenderer<
  HostNode = RendererNode,
  HostElement = RendererElement
>(options: RendererOptions<HostNode, HostElement>) {
  return baseCreateRenderer<HostNode, HostElement>(options)
}
...
...
function baseCreateRenderer(
  options: RendererOptions,
  createHydrationFns?: typeof createHydrationFunctions
): any {
...

  return {
    render,
    hydrate,
    createApp: createAppAPI(render, hydrate)
  }
...
...
export function createAppAPI<HostElement>(
  render: RootRenderFunction,
  hydrate?: RootHydrateFunction
): CreateAppFunction<HostElement> {
  return function createApp(rootComponent, rootProps = null) {
    if (!isFunction(rootComponent)) {
      rootComponent = { ...rootComponent }
    }
    ...
    const context = createAppContext()

    const app: App = (context.app = {
      _uid: uid++,
      _component: rootComponent as ConcreteComponent,
      _props: rootProps,
      _container: null,
      _context: context,
      _instance: null,
      ...
      use...
      mixin...
      component...
      directive...
      mount...
      unmount...
      provide...
      }
      return app;
...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值