Vue3核心运行时之runtime-core

Vue3 深度解析 前言 距离尤雨溪首次公开 Vue3 (vue-next)源码有一个多月了。青笔观察到,刚发布国庆期间,出现不少解读 Vue3 源码的文章。当然不少有追风蹭热之嫌,文章草草讲讲响应式原理,或者只是做了一些上层的导读,告诉读者应该先看哪再看哪。不能说这些文章就没有一点价值,它确实能够让你在短时间内,不用过多思考就能了解到一些 Vue3 重中之重的“干货”。但是过于干货的未必就是好的。因为干货通常是经过... 阅读详情

在 Vue3 的源码中,@vue/runtime-core 是整个框架的运行时的核心。它不直接操作DOM,通过@vue/runtime-dom实现vnode的创建、对比与更新。
本文主要基于runtime-core的核心流程,包括组件的初始渲染流程与更新等简要实现机制。

一、runtime-core作用

runtime-core = 平台无关的 VNode 调度器 + 组件生命周期管理
1.对比新旧虚拟 DOM,决定如何更新
2.管理组件实例的创建、渲染与更新

二、从 createApp 到 render

在vue日常开发中,入口文件通常会有这段创建应用实例的代码:

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

createApp是vue内部渲染器创建的一个函数,接收一个根组件后进行mount,实现如下:

createRenderer(options) //创建渲染器
// runtime-core 内部
//options 包含runtime-dom平台操作接口(如 insert, createElement, patchProp)等
//返回 { render, createApp }
export function createRenderer(options) {
  return createBaseRenderer(options)
}
export function createBaseRenderer(rendererOptions) { // 渲染时所到的api
    const render = (vnode,container) =>{ // 核心渲染方法
		// 将虚拟节点转化成真实节点插入到容器中.....
    }
    return {
        createApp:createAppAPI(render)
    }
}
//createAppAPI实现
let uid = 0
export function createAppAPI(render) {
    const createApp = (rootComponent, rootProps = null) => {
    const app = {
      _uid: uid++,
      _component: rootComponent,
      _props: rootProps,
      _container: null,
    //   _context: context,
      _instance: null,

      mount(rootContainer){
        const vnode = createVNode(rootComponent, rootProps)
        render(vnode, rootContainer)
        app._container = rootContainer
      }
    }
    return app
}
    return createApp
}




//createApp 返回应用实例
const app = createApp(rootComponent)
app.mount(container)

//mount 最终调用 render(vnode, container)

//render 启动首次渲染
function render(vnode, container) {
  patch(null, vnode, container) // 首次挂载:oldVNode 为 null
}

三、patch 函数

patch(n1, n2, container) 是 runtime-core 实现元素或组件挂载和比对的重要函数

if (n1 === n2) return // 相同节点,跳过

if (n1 && !isSameVNodeType(n1, n2)) {
  // 类型不同:卸载旧节点,挂载新节点
  unmount(n1)
  n1 = null
}
// 根据 n2 类型分发处理
switch (n2.type) {
  case Text: processText(n1, n2, container); break
  case Comment: processCommentNode(...); break
  default:
    if (shapeFlag & ELEMENT) processElement(...)
    else if (shapeFlag & COMPONENT) processComponent(...)
}
//关键思想:  
n1 == null时挂载(mount)  
n1 存在进行更新(update)

四、元素节点和组件处理

//处理元素节点:processElement
挂载:mountElement
创建真实元素:hostCreateElement
设置属性:hostPatchProp
插入容器:hostInsert
更新:patchElement
所有 hostXXX 操作均由 runtime-dom 提供,runtime-core 只调用接口。
//组件节点(processComponent)
//挂载(n1 == null)
mountComponent(n2, container) {
  const instance = createComponentInstance(n2)
  setupComponent(instance)        // 执行 setup()
  setupRenderEffect(instance)     // 创建渲染 effect!
}

//更新(n1 存在):
updateComponent(n1, n2) {
  if (shouldUpdateComponent(n1, n2)) {
    instance.next = n2           // 标记新 vnode
    instance.update()            // 触发 effect 重新执行
  }
}

五、组件自动更新简化实现版

//setupRenderEffect是组件实现自动更新的一个重要函数:

function setupRenderEffect(instance) {
  instance.update = effect(() => {
    if (!instance.isMounted) {
      const subTree = instance.render()
      patch(null, subTree, container)
      instance.isMounted = true
    } else {
      // 更新:render 新子树与旧子树 diff
      const nextTree = instance.render()
      patch(instance.subTree, nextTree, container)
      instance.subTree = nextTree
    }
  }, {
    scheduler: queueJob // 异步更新队列
  })
}

当ref 或 reactive 数据变更时会trigger找到依赖的 effect(即 instance.update),调用scheduler(异步批量更新),effect重新执行后调用render()再进行patch子树

六、总结

runtime-core不直接处理DOM操作,只通过runtime-dom对应方式处理vnode的实现,并贯穿应用实例的创建到卸载整个生命周期流程,本文主要基于runtime-core的核心实现流程,在具体应用包括组件数据渲染,响应式数据更新等一系列流程后续会进行更新。好了,今天就到这里,欢迎有问题的小伙伴一块交流!

Vue 3的内部模块化设计:`@vue/runtime-core`/`@vue/compiler-core`等模块的依赖与职责 Vue 3 的模块化设计将框架拆分为多个独立的部分,每个模块都有明确的职责。是核心运行时,负责组件生命周期和虚拟 DOM 管理;负责将模板编译成渲染函数;其他模块则围绕这两个核心模块,提供平台相关的扩展和支持。通过理解这些模块的依赖关系和职责,可以更深入地理解 Vue 3 的工作原理。更多IT精英技术系列讲座,到智猿学院。 阅读详情

相关推荐

基于PSO-BP神经网络的风电功率预测研究论文复现

风电功率预测。基于PSO-BP神经网络的风电功率预测论文复现。matlab程序,注释清晰。

weixin_825487230的博客 2295

vue3中vue和@vue/runtime-core的区别

引用@vue/runtime-core的api,在生产环境下数据不是响应式的。在开发环境OK。

letianxf的博客 2227

使用电荷放大器处理压电加速度计输出

电阻器 R p模拟传感器的绝缘电阻,为产生的电荷创建泄漏路径。在此图中,顶部波形显示传感器产生的电荷,而底部波形显示电荷放大器的输出。这需要具有大输入阻抗的放大级,以防止产生的电荷通过与传感元件并联的放大器的输入阻抗泄漏。换句话说,电荷放大器补偿传感器产生的电荷 q p ,反馈电容器 C F中具有相反极性的等量电荷。因此,任何与传感器并联的绝缘电阻,如电缆的绝缘电阻或传感器的漏电电阻Rp,都不能流过电流。漂移是指电荷放大器输出在一段时间内发生的变化,而不是由被测物理参数的变化(我们讨论的加速度)引起的。

weixin_45260069的博客 3905

【mini-vue】runtime-core模块学习

参数:rootComponent对象,是一个JavaScript对象(可能包含name、setup、render等属性)返回值:返回一个带有mounted方法的对象。

qq_53512708的博客 2359

【脑电绘图教程 2】使用Brainstorm进行脑电处理及源定位

Brainstorm 是一个开源应用程序,支持MEG、EEG、fNIRS、ECoG、深度电极和其他电生理学的数据分析,尤其用于MEG、EEG的源定位。Brainstorm的主要优点是其简单直观的图形界面,不需要进行任何编程,即可上手MEG、EEG分析,此外,它还支持多种数据类型(基本上EEGLab支持的,它都支持),并且具有数据批量处理功能,可以很方便的分析自己的数据。

qq_40735196的博客 1万+

ubuntu安装英伟达显卡驱动后wifi消失解决方法

ubuntu安装英伟达显卡驱动后(比如4090和3090等),会把wifi和蓝牙驱动去除,导致wifi无法连接。需要重新下载驱动安装。

人工智能(AI)技术,大模型技术,深度学习,机器学习,计算机视觉,AI工具实践应用等分享 3903

学习Vue3 第三十章(编写Vue3插件)

插件 插件是自包含的代码,通常向 Vue 添加全局级功能。你如果是一个对象需要有install方法Vue会帮你自动注入到install 方法 你如果是function 就直接当install 方法去使用 使用插件 在使用 createApp() 初始化 Vue 应用程序后,你可以通过调用 use() 方法将插件添加到你的应用程序中。 实现一个Loading Loading.Vue <template> <div v-if="isShow" class="loading

qq1195566313的博客 1万+

cmw500 lte非信令测试_WiFi信令测试在研发过程中的作用

  1、关于信令测试的故事  2016年的某天,某著名网络产品公司技术负责人致电寻求技术支持:我们的无线路由器遇到了一个困惑:我们某款路由器应用于实际WiFi网络中时,WiFi终端接入非常困难。但是我们使用测试工具检测此路由器,它的所有物理射频指标都非常优异。不知道是为什么?  我来到了测试现场看到:WiFi路由器受控于芯片公司的测试工具,其WiFi发射机指标在非信令测试仪上显示:无论功率、EVM...

weixin_39662263的博客 3925

Vue学习笔记2-安装Vue

Vue.js 设计的初衷就包括可以被渐进式地采用。这意味着它可以根据需求以多种方式集成到一个项目中。

摘繁华 1601

强化学习-----DQN(Deep Q-network)

DQN(Deep Q-Network)是一种基于深度学习和强化学习的算法,由DeepMind提出,用于解决离散动作空间下的马尔科夫决策过程(MDP)问题。它是首个成功将深度学习应用于解决强化学习任务的算法之一。DQN,即深度Q网络(Deep Q-network),是指基于深度学习的Q-Learing算法。那什么是Q-leaning?可以看上一篇文章Q-learning是一种经典的强化学习算法,用于解决马尔可夫决策过程(Markov Decision Process,MDP)中的控制问题。

qq_74722169的博客 2万+

SAP_PP模块中MRP中信号灯简介

一、信号灯的作用二、常见的信号灯颜色及含义三、信号灯的来源四、常见场景示例示例1:物料满足所有需求示例2:生产订单已延迟示例3:缺料或未产生计划订单五、相关事务码参考六、如何应对红色或黄色信号灯?七、前台操作说明在 SAP PP 模块中,**MRP(物料需求计划)运行结果中的“信号灯”是一种非常直观的可视化提示工具,用于帮助用户快速识别物料计划是否存在异常或需要关注的问题。这些信号灯通常出现在MD04(库存/需求清单)、MD05(单物料MRP清单)、MD07(MRP列表)**等事务代码的界面中。

我小时候很黑的博客 633

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

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

YSG的博客 892

利用恒源云在云端租用GPU服务器训练YOLOv10模型(包括Linux系统命令讲解)

为当涉及到深度学习的训练任务时,GPU的计算能力是不可或缺的。相对于传统的中央处理器(CPU),图形处理器(GPU)具有更强大的并行计算能力,能够显著加速深度学习模型的训练过程。深度学习算法通常涉及大量的矩阵运算和张量操作,而GPU的并行计算架构使得它们能够高效地执行这些计算,从而加速模型训练的速度。恒源云是一个经济高效的云计算平台,您可以通过恒源云的控制台或者命令行界面来管理实例、上传和下载数据、执行训练任务等。

Snu77的博客 1891

Vue3源码runtime-core运行时核心模块之scheduler调度器

Vue3调度器scheduler负责管理异步任务队列和执行顺序,核心实现位于runtime-core/scheduler.ts。它通过queueJob管理组件更新任务,queuePostFlushCb处理DOM更新后的回调,使用微任务确保异步执行。flushJobs和flushPostFlushCbs分别处理主任务队列和后置回调队列,通过currentFlushPromise避免重复刷新。watchEffect默认使用主队列,而watchPostEffect则通过queuePostFlushCb延迟到DOM

Jinuss的博客 582

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

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

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

Jinuss的博客 732

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Vue3源码runtime-core运行时核心模块之watch和watcherEffect源码解析

本文分析了Vue3中doWatch的实现原理及其衍生的四种监听方法。doWatch基于reactivity模块的watch进行封装,支持SSR和多种调度选项,通过配置scheduler、augmentJob等实现不同触发时机。watch需要显式指定监听源和回调,而watchEffect自动追踪回调中的响应式依赖。watchPostEffect和watchSyncEffect分别通过设置post和sync控制回调执行时机,前者在DOM更新后执行,后者同步执行。这些方法都基于doWatch的统一封装,提供了灵活

Jinuss的博客 593

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

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

Jinuss的博客 483

手写 vue 源码 === runtime-core 实现

分层架构:平台无关的核心逻辑:浏览器特定的 DOM 操作reactivity:独立的响应式系统虚拟节点(VNode)轻量级的 JS 对象描述 DOM使用 ShapeFlags 高效标识节点类型h()函数简化创建过程渲染器(Renderer)工厂函数接收平台操作patch函数处理初始化和更新递归处理子节点形成树形结构跨平台能力通过抽象 DOM 操作接口同一核心适用于 Web、小程序、Native通过实现 runtime-core,我们深入理解了 Vue3 的核心工作原理。

每天都要努力学习哦~~ 896

vue3运行时核心模块之runtime-dom

摘要: runtime-dom是Vue 3的核心运行时包,作为Vue的DOM操作适配层,提供浏览器环境下的DOM节点操作、事件绑定、属性更新等具体实现。它使Vue保持平台无关性,可适配浏览器、SSR、Native等不同环境。核心功能包括:1)nodeOps对象封装基础DOM操作方法(插入/移除节点、创建元素/文本节点等);2)patchProp处理属性更新,包含class/style/事件等特殊逻辑。通过平台相关实现与核心逻辑解耦,runtime-dom确保Vue在不同环境下高效运行。(149字)

Zhencode的博客 487

vue3.0源码分析--vue-next-master目录结构

文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种

weixin_50077637的博客 7915

Vue3源码学习环境搭建与调试指南:从响应式系统到运行时核心

现代前端框架的核心在于其响应式系统和虚拟DOM运行时机制。响应式系统通过依赖收集与触发更新实现数据驱动视图,其原理基于Proxy或defineProperty进行数据劫持,结合观察者模式管理副作用函数。虚拟DOM则作为跨平台的抽象层,通过高效的Diff算法最小化DOM操作,提升渲染性能。这些技术共同支撑了Vue、React等框架的高效开发体验。在工程实践中,理解框架源码需要搭建可调试的学习环境,掌握核心模块的调用链路。本文聚焦Vue3源码学习,详细介绍了如何配置开发环境、解析monorepo仓库结构,并重点

weixin_33883104的博客 226

Vue 3.0 源码导读

这个模块是基于上面模块而写的浏览器上的 runtime,主要功能是适配了浏览器环境下节点和节点属性的增删改查。很明显,这个模块就是 Composition API 的核心了,其中的 ref 和 reactive 应该重点掌握。这个模块则基于上个模块,针对浏览器做了适配,如对 textarea 和 style 标签做了特殊处理。大部分 Vue 开发者应该不会用到这个模块,因为它是专门用于自定义 renderer 的。代码仓库中有个 packages 目录,里面是 Vue 3 的主要功能的实现,包括。

On the way 436

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

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

寒露丶小白 421

Vue 3 源码学习教程

环境要求: Node.js 16+,pnpm 7+packages/ ├── reactivity/ # 响应式系统(面试重点) ├── runtime-core/ # 运行时核心(渲染、组件) ├── runtime-dom/ # 浏览器运行时(DOM操作) ├── compiler-core/ # 编译器核心(模板编译) ├── compiler-dom/ # 浏览器编译器 ├── vue/ # 入口,整合所有模块 ├── shared/ # 工具函数学习顺序: reactivity → runtime

weixin_44397974的博客 602

【vue3响应式原理】

setup是一个新的组件选项,它是组件内使用Composition API的入口 // 调用时刻是初始化属性确定后,beforeCreate之前。// 响应化:接收一个对象,返回一个响应式的代理对象 const state = reactive({ count: 0 })文件件内,实际上源码主要分为两部分,编译器和运行时环境。解决方式:将之前代理结果缓存,get时直接使用。建立响应数据key和更新函数之间的对应关系。vue 代码入口,整合编译器和运行时。// 返回对象将和渲染函数上下文合并。

demotang的博客 1054

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

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

m0_68324632的博客 953
上一篇: vue3运行时核心模块之runtime-dom
下一篇: Vue核心运行时runtime-core之组件挂载流程
Zhencode
博客等级 码龄7年 106粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值