vue3源码 - 渲染render(二)

183 阅读2分钟

前言

本篇是续 vue3源码 - 渲染render(一)之后的第二篇, 此篇主要是讲creatAppmount是如何创建app挂载app

creatApp 与 mount

我们可以知道runtime-dom中主要是存储了大量的操作dom的api

// runtime-dom/index.ts
import { createRender } from '@vue/runtime-core'  // 创建渲染的方法
import { extend } from '@vue/shared' // 工具方法

import { nodeOps } from './nodeOps' // 节点操作
import { patchProp } from './patchProp' // 属性操作

// 渲染时用到的所有方法(俩这结合)
const renderOptions = extend({ patchProp }, nodeOps)

// 举例
/* let App = {
  props: {},
  render(h){
    h('div', vvv)
  }
}
let app = createApp(App)
app.mount()
*/
// vue中runtime-core提供了核心的方法, 用来处理渲染, 他会使用runtime-dom中的api进行渲染
export function createApp(rootComponent, rootProps) {
  const app = createRender(renderOptions).createApp(rootComponent, rootProps) // 创建app还是通过这个createApp这实现的
  let { mount } = app // 真正的挂载方法
  app.mount = function (container) {   // 这里执行的是app.mount(container)然后会走下面逻辑
    container = nodeOps.querySelector(container) // 获取到dom元素
    container.innerHTML = ''
    mount(container) // 这个mount 是createAppAPI返回函数app的mount方法 往下看
  }
  return app
}

export {
  renderOptions
}

export * from '@vue/runtime-core'

我们在createApp实际调用的是createRender中的 createApp方法, 而mount方法也是在那边实现的,接下来我们看看这个createApp方法吧

// runtime-core/render.ts
export function createRender(renderOptions) {
    const render = (vnode, container) => {
        // core的核心, 根据不同的虚拟节点,创建对应的真实元素
        patch(null, vnode, container)
      }
   return {
       createApp: createAppAPI(render)
   }
}

这里的createApp又调用了 createAppAPI方法, 接下来我们看一下createAppAPI方法内部实现了什么?

// runtime-core/apiCreateApp
import { createVNode } from "./vnode" // 创建虚拟节点
export function createAppAPI(render) {
  return function createApp(rootComponent, rootProps) {
    const app = {
      _props: rootProps,
      _component: rootComponent,
      _container: null,
      mount(container) { // 挂载
        // 根据组件创建虚拟节点
         const vnode = createVNode(rootComponent, rootProps)
        // 将虚拟节点和容器获取后调用render方法进行渲染
        render(vnode, container)
        app._container = container
      }
    }
    return app
  }
}

本篇的creatAppmount到这里已经结束了

总结

creatApp的主要作用是传递需要创建的节点信息
mount主要作用是创建好虚拟节点, 然后通过render将虚拟节点转化为真实节点,最后进行挂载