Vue核心运行时runtime-core之组件挂载流程

【vue3源码学习】初始化流程分析:渲染器与 createApp 学习 vue3 源码,是不是一时不知道从哪里入手?不了解哪些有依赖关系,哪些能做什么事?今天我们就 vue 项目的初始化流程进行分析。 阅读详情

在Vue3的入口文件中,当我们在 main.js 中声明:

createApp(App).mount('#app')

当调用mount时,实际上执行的是上一篇文章涉及的渲染器相关的render,如下:

// App被解析为vnode
render(vnode, rootContainer)

一、从 render 到 patch

在render首次执行时,内部会执行

patch(null, vnode, container)

因为是首次渲染,旧节点 n1 = null,patch 函数识别到这是一个组件类型 VNode,因为组件在解析成vnode时会绑定shapeFlag类型属性,判断时:

if (shapeFlag & ShapeFlags.COMPONENT) {
       processComponent(
            n1, // null
            n2, //  vnode
            container,
            anchor
       )
}
const processComponent = (
  n1,
  n2,
  container,
  anchor
) => {
  if (n1 == null) {//首次挂载
    mountComponent(
        n2,
        container,
        anchor,
        parentComponent
      );
  } else {
   // updateComponent(n1, n2); 组件更新非本文核心流程先绕过
  }
};

关键判断:n1 == null → 执行 挂载(mount) 而非更新

二、组件实例化与初始化

1.mountComponent时创建组件实例

/*
* -组件实例创建函数
* @param vnode {object} -虚拟dom
* @returns instance {object} -组件实例
*/
function createComponentInstance(vnode) {
  const instance = {
        subTree: null, // 组件要渲染的子元素
        type, // 组件对象
        ctx: {}, // 组件的上下文
        props: {}, // 组件的属性
        attrs: {}, // 元素本身的属性
        slots: {}, // 组件的插槽
        setupState: {}, // 组件setup的返回值
        isMounted: false, // 组件是否被挂载?
        vnode
  }
  instance.ctx = {_: instance}
  return instance
}
const instance = createComponentInstance(vnode)

//创建一个组件实例对象(instance)
//初始化基础属性:
  vnode:当前 VNode
  type:组件定义(即 export default { ... })
  props、slots、ctx(上下文代理)
  isMounted = false
//此时还没有执行 setup
//instance会贯穿整个生命周期

三、启动setupComponent

//这是组件实例初始化后的总入口,内部根据组件类型分发:
setupComponent(instance)
// 1.函数式组件调用: setupFunctionalComponent
// 2.有setup状态组件:setupStatefulComponent

本文以状态组件为主,因为平时大家开发的都是有状态的非函数式组件

function setupStatefulComponent(instance) {
    // 通过创建proxy为后续实例数据更新做准备,非本文主要内容
    instance.proxy = new Proxy(instance.ctx,PublicInstanceProxyHandlers);
    const Component = instance.type;
    const {setup} = Component;
    if(setup){
        currentInstance = instance; // 保留当前实例
        const setupContext = createSetupContext(instance); // setup中的上下文,即ctx
        const setupResult = setup && setup(instance.props,setupContext);//在组件声明的setup函数中可访问对应参数
        handleSetupResult(instance,setupResult); // 处理返回值
        currentInstance = null;
    }else{
        finishComponentSetup(instance)
    }
}
function handleSetupResult(instance,setupResult){  
    if(isFunction(setupResult)){// 返回值可以是函数
        instance.render = setupResult
    }else if(isObject(setupResult)){ // 普通对象
        instance.setupState = setupResult
    }
    finishComponentSetup(instance)
}

此时 setup 已执行,但组件仍不能渲染——因为 render 函数还需最终确定

四、确认渲染函数 finishComponentSetup

export function finishComponentSetup(instance, isSSR, skipOptions) {
  const Component = instance.type;

  // 模板 / render 函数标准化
  if (!instance.render) {
    // 非 SSR 且存在编译器、且组件未提供 render 函数时,尝试编译 template
    if (!isSSR && compile && !Component.render) {
      let template = Component.template
      
      if (template) { 
          Component.render = compile(template)
      }
      }
  }

    // 设置实例的 render 函数
    instance.render = Component.render || NOOP;
  }

  // 开发环境警告:缺少 template 或 render
  if (
    __DEV__ &&
    !Component.render &&
    instance.render === NOOP &&
    !isSSR
  ) {
    if (!compile && Component.template) {
      warn(
        `Component provided template option but ` +
          `runtime compilation is not supported in this build of Vue.` +
          (__ESM_BUNDLER__
            ? ` Configure your bundler to alias "vue" to "vue/dist/vue.esm-bundler.js".`
            : __ESM_BROWSER__
            ? ` Use "vue.esm-browser.js" instead.`
            : __GLOBAL__
            ? ` Use "vue.global.js" instead.`
            : ``)
      );
    } else {
      warn(`Component is missing template or render function: `, Component);
    }
  }
}

这是确保组件可渲染的关键一步。它按优先级确定
setup() 返回函数 > instance.render
至此,instance.render 具备了渲染VNode 的能力,具体渲染流程和实例响应式机制后续会文章更新

五、总结

组件的挂载是分阶段执行的,从初始化实例创建 到 setup 执行再到 render 确认,而render 函数来源灵活 支持 setup 返回函数、模板编译等多种方式,而了解组件实例的创建与渲染器的绑定是后续进行组件数据响应式更新的前提,后续也会陆续更新,欢迎大家在评论区讨论交流!

Vue 3的内部模块化设计:`@vue/runtime-core`/`@vue/compiler-core`等模块的依赖与职责 模块依赖模块职责组件生命周期管理、响应式系统集成、虚拟 DOM 操作、Provide/Inject、内置组件、自定义渲染器 API提供操作 DOM 的 API、注册全局指令、处理事件监听解析、转换、代码生成,将模板编译成渲染函数处理特定于 DOM 的编译任务、优化 DOM 操作响应式数据、依赖追踪、Effect、Computed、Ref无提供各种工具函数。 阅读详情

相关推荐

树莓派4B(Raspbian buster系统)安装ROS Melodic(附带网络配置和远程桌面控制说明)

树莓派4B(Raspbian buster系统)安装ROS Melodic(附带网络配置和远程桌面控制说明) 一、硬件准备 二、软件准备 三、安装前的准备工作 四、开始ROS的安装 五、运行小乌龟 由于坑比较多希望大家安装的时候尽量不要跳步进行,一定要等每一步运行成功了再往下进行。 一、硬件准备 1、树莓派4B一个 2、SD卡一张(最好是16G以上的我的是用的64G的) 3、显示器、键盘、鼠标 二、软件准备 1、Raspberryimage (写系统使用的) 链接:https://pan.baidu.com

weixin_45315065的博客 1万+

【Vue3源码学习】— CH3 探索核心运行时: runtime-core

Vue 3 的 runtime-core 包含了 Vue 的核心运行时逻辑,它负责组件的创建、更新、渲染等核心功能。runtime-core 设计的目的是为了让 Vue 更加轻量,并且能够被不同的平台(如 Web、小程序等)复用。以下是一些 runtime-core 的关键概念和组成部分:虚拟 DOM 是对真实 DOM 的抽象表示,它允许 Vue 在内存中以 JavaScript 对象的形式描述 UI 结构,然后高效地计算出最小的更新操作来实现视图的更新。这减少了直接操作 DOM 的次数,提高了性能。Vue

YSG的博客 892

SEED-VII 实战指南:如何利用多模态脑电图数据提升情感识别精度

本文提供了SEED-VII多模态脑电图数据集的实战指南,详细介绍了如何利用该数据集提升情感识别精度。内容涵盖数据获取、预处理、特征提取,以及构建多模态融合神经网络模型的关键步骤,并强调了被试者独立评估的重要性,为情感计算研究者提供了从数据到模型的全流程解决方案。

weixin_29196891的博客 318

Vue3核心运行时之runtime-core

本文分析了Vue3运行时核心@vue/runtime-core的实现机制。主要内容包括:1) runtime-core作为平台无关的VNode调度器和组件生命周期管理器的作用;2) 从createApp到render的初始化流程,包括创建渲染器、应用实例和首次渲染;3) patch函数实现虚拟DOM的挂载和更新;4) 元素节点和组件的处理过程;5) 组件自动更新的简化实现,通过setupRenderEffect建立响应式更新机制。runtime-core通过调用runtime-dom提供的接口操作DOM,管

Zhencode的博客 507

开源分享:苹果群控手机源代码解析与实战

本文介绍了苹果设备群控的基本原理和实现方法,重点解析了基于Python+Appium的群控系统构建。主要内容包括:1)设备连接管理技术(USB/Wi-Fi);2)自动化控制方式(WDA/AppleScript/Appium);3)实战演示了通过Python脚本实现多设备同时控制,涵盖环境配置、代码解析和功能说明;4)提出了多线程、图像识别等优化方向。文章为开发者提供了快速上手的群控方案,适用于自动化测试、批量管理等场景,并推荐了相关开源项目参考。

2403_88540309的博客 1344

嵌入式学习的书单推荐

以上是一些优秀的嵌入式学习书单推荐。选择适合自己的学习材料对于学习嵌入式系统非常重要。每一本书籍都有其独特的优势和特点,读者可以根据自己的学习目标和兴趣选择合适的书籍。同时,我们也要注意不断实践和探索,结合实际项目和项目经验,不断提升自己的嵌入式技术水平。希望本文的推荐能够帮助大家在嵌入式学习的道路上取得更好的成果。

新程序圆 1980

【Vue3源码Runtime-core篇】 第一章 初识Runtime

当设计一个框架的时候,我们有三种选择:纯运行时的、运行时 + 编译时的或纯编译时的。我们先聊聊纯运行时的框架。

m0_68324632的博客 953

保姆级教程:用Smaart7和你的USB声卡搞定现场音响系统调试(附频谱与延时测试避坑指南)

本文提供Smaart7与USB声卡协同工作的现场音响系统调试指南,涵盖硬件连接、频谱分析、延时校准等关键步骤。通过详细的操作流程和常见问题解决方案,帮助音响工程师快速掌握专业测量技术,确保演出音质达到最佳状态。

weixin_29290259的博客 423

组件挂载流程详解

本文详细解析了Vue3组件挂载的核心流程。从createApp入口开始,通过mount方法触发挂载过程,包括创建VNode、组件实例和渲染effect。重点剖析了mountComponent、setupRenderEffect等核心函数,以及patch流程中DOM元素的创建过程。通过源码分析展示了Vue3如何将虚拟DOM转换为真实DOM并插入页面的完整机制,为理解Vue3的渲染原理提供了深入视角。

寒露丶小白 312

【RK3399 Ubuntu】基于rk3399的lxde的lubuntu桌面移植适配记录之第二步:最基本Ubuntu根文件系统的相关常用工具完善

文章目录1.使能系统网络管理服务1.1 安装驱动modules管理工具1.2 使能网络服务2.终端自动补全命令功能3.安装ssh服务4.安装系统信息查看工具5.安装resize工具6.安装lrzsz工具7.使能rc.local服务7.1 修改服务Install块7.2 使能rc.local.service服务7.3 添加执行脚本且赋予执行权限 续接上文,本文主要完善前面已经制作好的rootfs 1.使能系统网络管理服务 1.1 安装驱动modules管理工具 apt-get install kmod 1.

wang 恒 的博客 1387

20 Embedding 与向量检索:语义为什么能变成距离

Embedding 是 RAG 语义检索的数学基础。本文用工程视角讲清文本如何变成向量,为什么语义相近会表现为距离相近,Top-K 检索如何工作,以及在模型选择、同模型约束、精确匹配和召回评估上的常见坑。

老于的笔记的专栏 6204

Vue3源码runtime-core运行时核心模块之directive自定义指令

Vue3自定义指令开发指南 本文介绍了Vue3中自定义指令的开发方法和实际应用。主要内容包括: 自定义指令的基本概念和生命周期钩子函数 防抖指令的具体实现方案,支持灵活配置时间间隔 指令的全局注册方法 使用注意事项和性能考量 从源码层面解析指令的注册和绑定过程 文章通过防抖指令的完整示例,展示了如何从定义、注册到使用自定义指令的全流程,并深入分析了Vue3指令系统的底层实现原理,帮助开发者更好地理解和应用自定义指令功能。

Jinuss的博客 732

LLC型自驱动半桥谐振变换器:电压电流变化与自然换向解析

变换器的工作状态经历了多个阶段,从模态一的关断状态,到模态二和三的电流供电状态,每个阶段都得到了合理的设计和优化。的工作原理,尤其是在半个周期内的电压和电流变化。上图 展示了该变换器在工作时的电压和电流波形,它为我们揭示了变换器如何通过精确的电流和电压控制,优化性能并实现高效能转换。,并根据负载情况调整电流和电压的工作模式,能够极大提升变换器的效率,尤其是在零电压开通和自然换向的设计中,发挥着关键作用。这意味着,电流会随着时间周期的变化,呈现典型的振荡波形,从而达到良好的电流控制。是两个关键的电流变量。

weixin_43199439的博客 279

【Vue3源码Runtime-core篇】 第二章初始化Component

上一篇文章讲了整个包的核心逻辑,以及patch算法流程图流程图:render函数内patch算法和的流程,这一章就开始实现整个流程,我们只要按着流程去创建函数就可以了。

m0_68324632的博客 1391

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Vue源码学习笔记——组件挂载及创建

准备工作 备注:案例中使用的vue版本全部为2.6.10 git clone https://github.com/vuejs/vue.git npm install 进入package.json,在script中增加"dev:read"命令,具体如下 "scripts": { // 方便源码阅读 "dev:read": "rollup -w -c scripts/config...

connie_1990的博客 541

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

runtime-core初始化核心流程

首先从我们的main.js入手 App.js 导入的createApp是利用rollup打包库中的代码生成的lib文件夹中引入的看看我们的createApp函数中做了什么 首先会基于我们传入的App组件创建一个虚拟节点,可以先展示下生成的虚拟节点的结构 这个对象中的type其实就是我们在App传入的结构,最终会通过template编译成我们的渲染函数 h函数主要是用来创建我们的虚拟节点,第一个参数是我们的type节点类型,第二个是props,第三个是children 我们可以先了解vnode的创建函数,可以

军火库 945

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

vue3js 源码 学习一 runtime-core 调用流程与模块依赖关系图、源码结构

Vue 3 Runtime-Core 源码结构与调用流程解析:文章详细剖析了Vue 3核心运行时的模块结构,包括组件创建、渲染、响应式更新等核心流程。重点展示了从createApp到mount的初始化过程,以及响应式数据变化触发更新的完整路径(数据→DOM)。核心模块如renderer.ts处理渲染与patch,component.ts管理组件实例,scheduler.ts实现异步更新调度。文章还简要介绍了Diff算法、生命周期触发时机,并推荐了源码阅读顺序,建议通过调试renderer.ts的patch流

初遇你时动了情 229

Vue3源码梳理:关于运行时和编译时

上述 v-if 和 m-com 自定义组件不是正常的html, 浏览器是不认识的,所以不会解析。.vue文件是单文件组件, 在template中写入的html是真实的html标记节点么?vue中的编译时,准确来说是编译器的意思,核心代码在 compiler-core模块下。运行时做不到的事情,通过html标签结构的方式来渲染解析成真实的dom节点。初次渲染,会生成一个ul标签,同时生成三个li标签,并把他们挂载到div中。这个过程主要是:让假标记,被渲染成真实的html标签,最终呈现给用户。

Wang的专栏 990

如何快速学习Vue.js Core源码:从入门到精通的完整指南

Vue.js Core是Vue.js框架的核心实现,包含了响应式系统、组件系统、虚拟DOM等关键模块。本文将带你深入探索Vue.js Core的源码结构,掌握其内部工作原理,帮助你从使用框架到理解框架的蜕变。 ## 📋 目录 - [准备工作:环境搭建](#准备工作环境搭建) - [源码结构解析:核心模块一览](#源码结构解析核心模块一览) - [响应式系统探秘:数据驱动的奥秘](#响应式系统探

gitblog_00990的博客 465

终极Vue.js源码解析:从入口到渲染的完整流程指南

Vue.js作为一款渐进式JavaScript框架,以其易用性和灵活性深受开发者喜爱。本文将带你深入探索Vue.js的内部工作机制,从源码入口到最终渲染的完整流程,帮助你理解这个强大框架的核心原理。 ## Vue.js的核心架构概览 Vue.js的源码组织结构清晰,主要分为多个功能模块,每个模块负责不同的功能。在`packages/`目录下,你可以看到这些核心模块: - **compiler

gitblog_00795的博客 951

Vue3源码runtime-core运行时核心模块之provide依赖和inject注入详解

摘要 Vue3中的provide和inject提供了一种跨层级组件通信机制。provide将数据存储在组件实例的provides属性中,通过原型链实现继承。子组件通过inject从父组件链中查找对应值,支持默认值和工厂函数。这种方法避免了传统props逐层传递的繁琐,实现了更灵活的组件通信。源码分析展示了其实现细节,包括数据存储、查找和默认值处理机制。

Jinuss的博客 483

Vue3 源码目录结构与构建流程 | monorepo 结构、packages 目录划分、构建脚本解析

本文深入解析了Vue3的源码目录结构与构建流程。Vue3采用Monorepo架构,将核心功能拆分为多个独立包,包括响应式系统(reactivity)、平台无关运行时(runtime-core)、DOM运行时(runtime-dom)、编译器(compiler-core/dom)等。这些模块通过shared包共享工具函数,最终由vue包整合为完整框架。构建流程使用Rollup打包,包含开发和生产模式配置。这种架构设计提升了代码复用性和可维护性,为深入理解Vue3源码奠定了基础。

寒露丶小白 421

Vue2源码梳理:在 import Vue 时干了啥

在Web应用的 Vue.js 构建过程的 Runtime + Compiler 版本下,我们重点关注这个版本

Wang的专栏 484

vue3源码详细分析

Vue 3是目前比较流行和使用的一种现代化JavaScript框架,其源码分析对于加深对前端框架的理解和开发能力有很大帮助。Vue 3源码主要由以下几个模块组成:Compiler模块:解析Vue模板,将其转换为渲染函数。Renderer模块:将组件渲染为真实的DOM元素。Reactivity模块:实现了响应式数据绑定。Runtime-core模块:实现了Vue组件的实例化、生命周期、事件等核心功能。Shared模块:包含了一些公共的工具函数。

一步一个脚印,踏实努力,向着目标前进 6286

vue3源码分析——实现createRenderer,增加runtime-test

本期主要实现了`createRenderer函数`,`改造createApp`等函数,通过这些函数,可以看到vu3在设计方面的用心良苦,尽量让vue3满足更多的人。增加了`runtime-test`,方便用于测试dom环境下面的情况!

twinkle的博客 1271

【学习笔记】Vue3源码解析:第五部分 - 实现渲染(1)

基本就是前两节的一个总结。

youyoufenglai的博客 1222
上一篇: Vue3核心运行时之runtime-core
下一篇: Vue3虚拟DOM创建器之h函数
Zhencode
博客等级 码龄7年 106粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值