当前位置: 首页 > news >正文

Vue3 源码解读系列(二)——初始化应用实例

初始化应用实例

  1. 创建 Vue 实例对象

    createApp 中做了两件事:

    1. 创建 app 对象
    2. 保存并重写 mount
    /*** 创建 Vue 实例对象*/
    const createApp = ((...args) => {// 1、创建 app 对象,延时创建渲染器,优点是当用户只依赖响应式包的时候,可以通过 tree-shaking 移除核心渲染逻辑相关的代码,减少体积const app = ensureRenderer().createApp(...args)// 2、保存并重写 mountconst { mount } = appapp.mount = (containerOrSelector) => {// ...}return app
    })
    

    为什么需要重写 mount 方法,而不把相关逻辑放在 app 对象的 mount 方法内部来实现呢?

    答:因为 Vue 不仅仅是为 Web 平台服务,它的目标是支持跨平台渲染createApp 函数内部的 app.mount 方法是一个标准的可跨平台的组件渲染流程,因此需要根据具体场景进行定制化。

  2. 使用 ensureRenderer().createApp() 来创建 app 对象

    // 渲染相关的一些配置,比如:更新属性的方法,操作 DOM 的方法
    const rendererOptions = {patchProp,...nodeOps
    }let renderer
    /*** 检查是否存在渲染器*/
    function ensureRenderer() {return renderer || (renderer = createRenderer(rendererOptions))
    }
    /*** 创建渲染器*/
    function createRenderer(options) {return baseCreateRenderer(options)
    }
    /*** 创建渲染器的基本逻辑*/
    function baseCreateRenderer(options) {// 组件渲染的核心逻辑function render(vnode, container) {// ...}return {render,createApp: createAppAPI(render)}
    }
    /*** 创建应用实例的 API*/
    function createAppAPI(render) {// 创建应用实例,接收的两个参数:rootComponent - 根组件的对象 和 rootProps - props参数return function createApp(rootComponent, rootProps = null) {const app = {_component: rootComponent,_props: rootProps,// app.mount 组件挂载逻辑mount(rootContainer) {// 1、创建根组件的 vnodeconst vnode = createVNode(rootComponent, rootProps)// 2、利用渲染器渲染 vnoderender(vnode, rootContainer)// 3、设置应用实例的容器为根组件的容器app._container = rootContainerreturn vnode.component.proxy}}return app}
    }
    
  3. 重写 app.mount 方法

    /*** 重写 app.mount 方法* 重写的目的:* 1、让用户可以更灵活的使用 API* 2、兼容 Vue2 的写法*/
    app.mount = (containerOrSelector) => {// 1、标准化容器,可以传字符串选择器或 DOM 对象,如果传的是字符串选择器则会将其转换为 DOM 对象作为最终挂载的容器const container = normalizeContainer(containerOrSelector)if (!container) returnconst component = app._component// 2、如果组件对象没有定义 render 函数和 template 模板,则取容器的 innerHTML 作为组件模板内容if (!isFunction(component) && !component.render && !component.template) {component.template = container.innerHTML}// 3、挂载前清空容器内容container.innerHTML = ''// 4、真正的挂载return mount(container)
    }
    

相关文章:

Vue3 源码解读系列(二)——初始化应用实例

初始化应用实例 创建 Vue 实例对象 createApp 中做了两件事: 创建 app 对象保存并重写 mount /*** 创建 Vue 实例对象*/ const createApp ((...args) > {// 1、创建 app 对象,延时创建渲染器,优点是当用户只依赖响应式包的时候&#xff0…...

网络原理-UDP/TCP详解

一. UDP协议 UDP协议端格式 由上图可以看出,一个UDP报文最大长度就是65535. • 16位长度,表示整个数据报(UDP首部UDP数据)的最大长度(注意,这里的16位UDP长度只是一个标识这个数据报长度的字段&#xff0…...

C#多线程入门概念及技巧

C#多线程入门概念及技巧 一、什么是线程1.1线程的概念1.2为什么要多线程1.3线程池1.4线程安全1.4.1同步机制1.4.2原子操作 1.5线程安全示例1.5.1示例一1.5.2示例二 1.6C#一些自带的方法实现并行1.6.1 Parallel——For、ForEach、Invoke1.6.1 PLINQ——AsParallel、AsSequential…...

c primer plus_chapter_four——字符串和格式化输入/输出

1、strlen();const;字符串;用c预处理指令#define和ANSIC的const修饰符创建符号常量; 2、c语言没有专门储存字符串的变量类型,字符串被储存在char类型的数组中;\0标记字符串的结束&a…...

Python Fastapi+Vue+JWT实现注册、登录、状态续签【登录保持】

文章目录 一、实现流程1.注册2.登录3.登录保持【状态续签】二、实现方法1.注册2.登录+登陆状态保持* 后端部分* 前端部分一、实现流程 1.注册 Created with Raphal 2.3.0...

oracle-sql语句解析类型

语句执行过程:1. 解析(将sql解析成执行计划) 2.执行 3.获取数据(fetch) 1. shared pool的组成。 share pool是一块内存池。 主要分成3块空间。free, library(库缓存,缓存sql以及执行计划),row cache(字典缓存) select * from v…...

2023 年最新企业微信官方会话机器人开发详细教程(更新中)

目标是开发一个简易机器人,能接收消息并作出回复。 获取企业 ID 企业信息页面链接地址:https://work.weixin.qq.com/wework_admin/frame#profile 自建企业微信机器人 配置机器人应用详情 功能配置 接收消息服务器配置 配置消息服务器配置 配置环境变量…...

3、FFmpeg基础

1、FFmpeg 介绍 FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库。 2、FFmpeg 组成 - libavformat:用于各种音视频[封装…...

c语言:用指针解决有关字符串等问题

题目1&#xff1a;将一个字符串str的内容颠倒过来&#xff0c;并输出。 数据范围&#xff1a;1≤len(str)≤10000 代码和思路&#xff1a; #include <stdio.h> #include<string.h> int main() {char str1[10000];gets(str1);//读取字符串内容char* p&str1[…...

吃透 Spring 系列—Web部分

目录 ◆ Spring整合web环境 - Javaweb三大组件及环境特点 - Spring整合web环境的思路及实现 - Spring的web开发组件spring-web ◆ web层MVC框架思想与设计思路 ◆ Spring整合web环境 - Javaweb三大组件及环境特点 在Java语言范畴内&#xff0c;web层框架都是基于J…...

JAVA后端服务端与移动端客户端高精度时间同步思路

一、脑补 在Chrome--->Network----> Timing中可以查看一个请求在各个阶段所花费的时间。 Timing中各个字段的意思发&#xff1a; 1、Queueing&#xff1a;从增加到等待处理队列到实际开始处理的时间间隔——浏览器也有线程机制&#xff0c;所有的请求不能同时发送&…...

nsd的资料

nsd是一款开源的DNS服务器应用。 近期参与项目过程中&#xff0c;涉及到DNS业务&#xff0c;结果被打的满头包。 虽然在校学习时就知道DNS协议&#xff0c;但从业这么多年&#xff0c;对于DNS协议的理解其实一直处于一知半解的状态。 当前处理问题时&#xff0c;接触到了nsd&am…...

关于Maven中pom.xml文件不报错但无法导包解决方法

问题 我的pom文件没有报红&#xff0c;但是依赖无法正常导入。 右下角还总出现这种问题。 点开查看报错日志。大致如下 1) Error injecting constructor, java.lang.NoSuchMethodError: org.apache.maven.model.validation.DefaultModelValidator: method <init>()V no…...

使用决策树分类

任务描述 本关任务&#xff1a;使用决策树进行分类 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.使用决策树进行分类 使用决策树进行分类 依靠训练数据构造了决策树之后&#xff0c;我们可以将它用于实际数据的分类。在执行数据分类时&#xff0c;需要…...

STM32H563烧录后无法擦除

STM32H563烧录后无法擦除&#xff0c;使用STM32CubeProgrammer连接后显示如下图所示。...

2023最新最全【Adobe After Effection 2023】下载安装零基础教程【附安装包】

AE2023下载点这里 教学 1.鼠标右击【Ae2023(64bit)】压缩包选择&#xff08;win11系统需先点击“显示更多选项”&#xff09;【解压到 Ae2023(64bit)】。 2.打开解压后的文件夹&#xff0c;鼠标右击【Set-up】选择【以管理员身份运行】。 3.点击【文件夹图标】&#xff0c;…...

【Spring之底层核心架构概念解析】

文章目录 一、BeanDefinition二、BeanDefinitionReader2.1、AnnotatedBeanDefinitionReader2.2、XmlBeanDefinitionReader 五、ClassPathBeanDefinitionScanner六、BeanFactory七、ApplicationContext7.1、AnnotationConfigApplicationContext7.2、ClassPathXmlApplicationCont…...

手把手带你创建一个自己的GPTs

大家好&#xff0c;我是五竹。 最近GPT又进行了大升级&#xff0c;这一下又甩了国内AI几条街&#xff0c;具体更新了哪些内容之前的一篇文章中其实已经说过了&#xff1a;ChatGPT 王炸升级&#xff01;更强版 GPT-4 上线&#xff01; 其中最重要的一点就是支持自定义GPT&…...

Vue 组件+es6箭头函数+路由

一、组件 1、让网页或局部页实现复用&#xff0c;包括js&#xff08;vue&#xff09;功能 组件&#xff08;Component&#xff09;是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素&#xff0c;封装可重用的代码。在较高层面上&#xff0c;组件是自定义元素&#xff0c; …...

Clickhouse学习笔记(5)—— ClickHouse 副本

Data Replication | ClickHouse Docs 副本的目的主要是保障数据的高可用性&#xff0c;即使一台 ClickHouse 节点宕机&#xff0c;那么也可以从其他服务器获得相同的数据 注意&#xff1a; clickhouse副本机制的实现要基于zookeeperclickhouse的副本机制只适用于MergeTree f…...

P1464 [PacNW 1999] Function

一、题目描述 题目链接&#xff1a; P1464 [PacNW 1999] Function - 洛谷 二、解题思路 可以使用dfs记忆化搜索的方法来解决这个问题。 通过阅读题目可知&#xff0c;w(a,b,c)的最小值为1&#xff0c;所以可以将memo数组初始化为0&#xff0c;第三、四种情况时&#xff0c;先…...

游戏洞察力 | 为什么塔防游戏总能赚钱?从玩法设计看品类底层逻辑

在上一篇内容中&#xff0c;我们深入剖析了塔防游戏的商业价值核心&#xff0c;发现其凭借低门槛、高覆盖的用户基础、可深度挖掘的策略空间以及强兼容的玩法框架&#xff0c;成为天然适配广告变现的优质手游品类&#xff0c;也理解了这一经典品类能够长期稳居市场的底层逻辑。…...

如何安装Oracle 12c Cloud Control_OMS服务端组件与Agent部署

OMS安装卡在“Configuring Enterprise Manager Cloud Control”阶段主因是数据库连接失败或SYSAUX表空间不足&#xff1b;Agent状态为“Unknown”多因证书未信任或OMS URL缺失协议/端口&#xff1b;升级失败系OMS更新目录未手动同步补丁&#xff1b;Windows监控SQL Server需启用…...

知识竞赛软件如何选择?抢答器功能

知识竞赛软件怎么选&#xff1f;抢答器功能是关键 组织一场精彩、公平、高效的知识竞赛&#xff0c;离不开专业软件的支持。在众多功能中&#xff0c;抢答器功能往往是决定竞赛成败的核心。本文将系统性地探讨如何选择一款合适的知识竞赛软件&#xff0c;并深入分析抢答器功能…...

软件系统规划步骤和可行性研究步骤

前者是系统开发初始阶段的宏观活动序列,后者则是规划阶段中的一项核心子任务。 一、软件系统规划步骤(典型过程) 系统规划通常属于软件生命周期的“项目立项与计划”阶段,常见步骤如下: 初步调查 识别项目机会、用户需求、业务痛点,明确系统建设的初步目标与范围。 问题…...

BGE-M3移动端部署:Android/iOS调用BGE-M3嵌入服务SDK封装

BGE-M3移动端部署&#xff1a;Android/iOS调用BGE-M3嵌入服务SDK封装 1. 项目背景与价值 BGE-M3是一个专门为检索场景设计的三合一"多功能"文本嵌入模型。它集成了密集检索、稀疏检索和多向量检索三种模式&#xff0c;能够在不同场景下提供最优的文本相似度计算能力…...

qt+vlc实现解码h264/h265裸码流播放

一 概述本文章实现了对h264/h265裸码流的解码播放功能,主要是一个基于VLC实现的H.264/H.265裸流解码播放类。主要功能包括&#xff1a;1)通过OpenStream接口打开流并指定显示窗口&#xff1b;2)使用InputStream接口输入裸流数据&#xff1b;3)通过CloseStream关闭流。核心实现采…...

Java全核心-阿里大厂面试-Gemini版

完善更新中......一、Java 核心基础1、Java 四大引用与 ThreadLocal 深度拷问【核心连环炮】面试官&#xff1a;说一下 Java 的四大引用及其实际业务场景&#xff1f;面试官&#xff1a;ThreadLocal 为什么要用弱引用&#xff1f;不用行不行&#xff1f;面试官&#xff1a;既然…...

一文讲清,精益六西格玛咨询是什么意思?做精益六西格玛咨询对企业有什么用?

精益六西格玛咨询到底是什么&#xff1f;简单来说&#xff0c;精益六西格玛咨询是一种将精益生产的效率与六西格玛的质量管理相结合的系统化服务&#xff0c;旨在帮助企业消除浪费并减少变异。通过引入精益六西格玛咨询&#xff0c;企业能够利用数据驱动的方法解决复杂的管理难…...

OpenClaw技能组合技:Phi-3-mini-128k-instruct多模块协作处理

OpenClaw技能组合技&#xff1a;Phi-3-mini-128k-instruct多模块协作处理 1. 为什么需要技能组合技&#xff1f; 上周我需要处理一份市场调研的Excel数据&#xff0c;包含3000多条杂乱记录。手动清洗要花大半天时间&#xff0c;而用Python脚本又得反复调试。当我尝试用OpenCl…...