首页 > 编程语言 >vue3源码入口

vue3源码入口

时间:2023-08-10 15:03:58浏览次数:38  
标签:container 函数 render mount 入口 源码 vue3 const app

vue 有两个阶段   分为编译时 和运行时

webpack    把vue模板编译生成对应的js代码,vue组件组件对应的template模板会被编译器转化为render函数。 

运行时

编译后代码执行render函数 并返回VNode,最后将VNode 渲染成真实的DOM节点

createApp > ensureRenderer > createRenderer > baseCreateRenderer > createAppApi > mount

// overload 1: no hydration
function baseCreateRenderer<
  HostNode = RendererNode,
  HostElement = RendererElement
>(options: RendererOptions<HostNode, HostElement>): Renderer<HostElement>

// overload 2: with hydration
function baseCreateRenderer(
  options: RendererOptions<Node, Element>,
  createHydrationFns: typeof createHydrationFunctions
): HydrationRenderer


createApp 函数调用 ensureRenderer 函数  ensureRenderer 函数调用

createRenderer 函数 createRenderer 函数调用baseCreateRenderer函数 

baseCreateRenderer 返回 

return {
  render,
  hydrate,
  createApp: createAppAPI(render, hydrate)
}

  函数执行

  1. const patch = () => {} // 核心diff过程
  2. const processElement = () => {} // 处理element
  3. const mountElement = () => {} // 挂载element
  4. const mountChildren = () => {} // 挂载子节点
  5. const processFragment = () => {} // 处理fragment节点
  6. const processComponent = () => {} // 处理组件
  7. const mountComponent = () => {} // 挂载组件
  8. const setupRenderEffect = () => {} // 运行带副作用的render函数
  9. const render = () => {} // 渲染挂载流程

createAppAPI 工厂函数创建app

createAppAPI返回的createApp函数才是真正创建应用的入口。在createApp里会创建vue应用的上下文,同时初始化app,并绑定应用上下文到app实例上,最后返回app

重写mount方法

  1. // 创建vue应用上下文
  2. const context = createAppContext();


  1. const createApp = ((...args) => {
  2. // ...
  3. const { mount } = app; // 缓存最初的mount方法
  4. // 重写mount
  5. app.mount = (containerOrSelector) => {
  6. // 获取容器
  7. const container = normalizeContainer(containerOrSelector);
  8. if (!container) return;
  9. const component = app._component;
  10. // 判断如果传入的根组件不是函数&根组件没有render函数&没有template,就把容器的内容设置为根组件的template
  11. if (!isFunction(component) && !component.render && !component.template) {
  12. component.template = container.innerHTML;
  13. }
  14. // 清空容器内容
  15. container.innerHTML = '';
  16. // 执行缓存的mount方法
  17. const proxy = mount(container, false, container);
if (container instanceof Element) {
  container.removeAttribute('v-cloak')
  container.setAttribute('data-v-app', '')
}
  1. return proxy;
  2. };
  3. return app;
  4. });

重写mount 方法 

完成渲染














标签:container,函数,render,mount,入口,源码,vue3,const,app
From: https://blog.51cto.com/u_15716707/7035618

相关文章

  • Vue3中的defineProps方法
    1.什么是definePropsdefineProps是Vue3中的一种新的组件数据传递方式,可以用于在子组件中定义接收哪些父组件的props。当父组件的props发生变化时,子组件也会随之响应。2.如何使用defineProps?在子组件中可以使用defineProps声明该组件需要接收的props,它需要传递一个包含props字段......
  • 直播弹幕源码开发很难?一招教你解决
    如果你在开发直播弹幕源码的途中碰到很多棘手问题,不要慌,本篇来逐步击破直播弹幕源码的难点。弹幕互动的原理如下图:1.直播弹幕源码接收和存储:设置一个服务器来接收和处理弹幕请求。接收到弹幕数据后,使用NoSQL数据库,可以将其存储到数据库中。2.直播弹幕源码推送:在直播过程中,服务器需......
  • 【25章】Java七大热门技术框架源码解析
    点击下载:【25章】Java七大热门技术框架源码解析 提取码:c12h Java七大热门技术框架源码解析视频教程分享,2023最新,一共25章!汇聚了JavaWeb开发主流热门框架(SpringFramework,SpringData,SpringBoot,SpringCloud,Mybatis,Tomcat,RocketMQ):框架1:SpringFrameworkspringframework是s......
  • Spring cloud智慧工地源码(项目端+监管端+数据大屏+APP)
    【智慧工地PC项目端功能总览】一.项目人员管理包括:信息管理、信息采集、证件管理、考勤管理、考勤明细、工资管理、现场统计、WIFI教育、工种管理、分包商管理、班组管理、项目管理。1.信息管理:头像、姓名、性别、身份证、进场时间、分包单位、劳务工种、项目履历、是否零工、计......
  • 深入源码分析:掌握Java设计模式的精髓
    深入源码分析:掌握Java设计模式的精髓作为一个开发人员,在进行一个项目的设计与实现的过程中,应当具备软件架构的全局观,对项目进行模块化的设计,并充分考虑代码的可复用性,用最少的代码实现最完备的功能,使代码简洁、优雅。优秀的系统应兼备功能强大、模块清晰、高扩展性,这离不开对各......
  • centos7 源码安装keepalived 【亲测有效,没有效果你来找我】
    环境keepalived版本:keepalived-2.2.7操作系统:cenos7安装方式:源码编译安装环境安装#安装包下载wgethttps://keepalived.org/software/keepalived-2.2.7.tar.gz#安装编译源码所需依赖yum-yinstallgccopenssl-devellibnfnetlink-devellibnllibnl-develpopt-devel......
  • 大连人工智能计算平台——华为昇腾AI平台——高性能计算HPC的pytorch源码编译报错——
     如题:pytorch源码编译报错——USE_CUDA=OFF  在编译pytorch源码的时候发现错误,虽然编译环境中已经安装好CUDA和cudnn,环境变量也都设置好,但是编译好的pytorch包wheel总是在运行torch.cuda.is_available()显示false,于是从编译源码的过程中进行重新检查,发现在编译的过程中提......
  • vue3 + vite + vue-router 4.x项目在router文件中使用pinia报错
    1.背景vue-router4.x版本,想在路由文件中引入并使用pinia后报错如下:表面意思是getActivePinia()方法在pinia还没有激活的时候被调用,导致报错。2.解决方法在stores文件夹下新建pinia.js文件,用来引入并创建pinia实例。import{createPinia}from"pinia";const......
  • SpringBoot源码实用场景:SpringBoot 3.1.0 环境下 PageHelper 1.4.0不生效问题排查
    1、技术栈:JDK17+SpringBoot3.1.0+PageHelper1.4.01<?xmlversion="1.0"encoding="UTF-8"?>2<project...>3<parent>4<groupId>org.springframework.boot</groupId>5<arti......
  • 在直播系统源码中接入谷歌支付
    支付在直播系统源码中有很重要的作用,在直播平台中,送礼物、买东西等很多功能都需要用到支付这个功能,支付方式上的接入服务也是越来越来,下面就给大家介绍下载直播系统源码中接入谷歌支付的过程。android同胞我相信很多人跟我一样谷歌支付运行自己的直播系统源码的时候调用支付发现......