React中Fiber树构建过程详解——react中render一个App组件(包含子组件)的流程详解
在 React 中,渲染一个包含子组件的组件涉及一系列底层流程,包括构建虚拟 DOM(React Element)、协调(Reconciliation)、Fiber 树管理和最终的 DOM 操作。以下是一个从底层解析的详细流程:
1. 初始化阶段
当开发者调用 React 的顶层 API 渲染组件时,例如:
ReactDOM.createRoot(document.getElementById('root')).render(<Parent />);
React 开始构建组件树。假设 Parent
组件包含子组件:
function Parent() {return (<div><Child /></div>);
}function Child() {return <p>Hello, World!</p>;
}
2. 创建 React Element
当调用 <Parent />
时,React 会将其转化为React 元素树(虚拟 DOM 树)。这一步是通过调用组件函数实现的:
- React 会调用
Parent
,执行其返回值。 Parent
返回的是一个 JSX 树,它被转化为一个 JavaScript 对象,称为 React Element:const parentElement = {type: 'div',props: {children: {type: Child, // 子组件props: {}, // 子组件的 props},}, };
- 对于
Child
,React 会继续递归调用它,得到:const childElement = {type: 'p',props: {children: 'Hello, World!',}, };
3. 进入协调(Reconciliation)阶段
React 开始协调组件树,即比较新旧虚拟 DOM,决定需要的更新。
构建 Fiber 节点
React 为每个 React Element 创建一个对应的 Fiber 节点。Fiber 是 React 的内部数据结构,用于描述组件树的状态:
- 父组件
Parent
Fiber:const parentFiber = {tag: 'HostComponent', // 表示是原生 DOM 元素type: 'div', // 节点类型stateNode: null, // 对应的真实 DOM(稍后会赋值)child: childFiber, // 指向子组件的 Fibersibling: null, // 指向兄弟节点 };
- 子组件
Child
Fiber:const childFiber = {tag: 'HostComponent', // 原生 DOM 元素type: 'p', // 节点类型stateNode: null, // 对应的真实 DOMchild: null, // 没有子节点sibling: null, // 没有兄弟节点 };
协调子节点
React 调用 reconcileChildren
比较新旧 Fiber 树的差异,决定是否复用、删除或新增节点。
- 在首次渲染时,旧 Fiber 树为空,React 会根据 React 元素树直接构建 Fiber 树。
- 对于每个 Fiber 节点,React 会递归地调用
beginWork
和completeWork
,处理子组件并更新其状态。
4. 渲染阶段(Render Phase)
beginWork
函数
beginWork
是 Fiber 协调的核心函数。它处理当前 Fiber 节点,并根据组件类型执行不同逻辑:
-
对于
Parent
(<div>
):- 检查是否需要更新:首次渲染会直接创建。
- 调用
reconcileChildren
处理子节点,递归进入Child
节点。
-
对于
Child
(<p>
):- 继续调用
reconcileChildren
,但因为它是文本节点,直接处理为完成状态。
- 继续调用
创建 DOM 节点
当 Fiber 节点处理完毕后,React 会通过 completeWork
创建真实的 DOM 节点,并赋值给 stateNode
:
- 对于
Parent
:parentFiber.stateNode = document.createElement('div');
- 对于
Child
:childFiber.stateNode = document.createElement('p'); childFiber.stateNode.textContent = 'Hello, World!';
5. 提交阶段(Commit Phase)
提交阶段是 Fiber 树计算完成后,将更新应用到真实 DOM 的过程。
执行 DOM 操作
React 将根据 Fiber 树生成的 stateNode
,完成以下 DOM 操作:
- 将
Parent
的stateNode
(<div>
)挂载到根 DOM 容器。 - 将
Child
的stateNode
(<p>
)作为子节点,插入到Parent
的stateNode
中。
生命周期回调
对于有生命周期方法(如类组件)的组件,会在此阶段触发 componentDidMount
或 useEffect
回调。
6. 最终 DOM 输出
最终,React 在真实 DOM 中渲染出:
<div><p>Hello, World!</p>
</div>
7. 优化机制
React 的底层设计支持高效渲染:
- Fiber 数据结构:实现任务切片、可中断更新。
key
属性:通过key
帮助 React 精确复用子节点,减少无意义的 DOM 操作。- 批量更新:React 会在批量更新模式下合并多次更新,减少重绘。
8. 总结
- React 将 JSX 转化为 React 元素树。
- React 构建 Fiber 树,递归调用组件以处理子组件。
- 在协调阶段,React 比较新旧 Fiber 树,生成新的 Fiber 树。
- 在渲染阶段,React 创建真实 DOM 并在提交阶段更新 DOM。
- 通过优化机制(如任务切片、批量更新、
key
比较等)提升性能。
React 的设计通过 Fiber 架构实现了高效渲染和可中断任务调度,使得复杂组件树的渲染和更新性能得到极大提升。
在 React 中,Fiber 架构通过 双缓存机制(Double Buffering) 实现了高效的更新和渲染。双缓存是 React Fiber 系统的核心设计之一,它使得 React 可以在后台异步构建新 Fiber 树,同时保持当前界面的稳定性。
以下是详细的解析和 Fiber 树的构建过程。
一、双缓存机制的简介
1. 双缓存的核心思想
React 使用两棵 Fiber 树:
- current Fiber 树:当前屏幕上显示的 Fiber 树,表示已渲染到 DOM 的 UI 状态。
- workInProgress Fiber 树:新的一棵 Fiber 树,用于处理更新。当更新完成后,这棵树会替代
current
成为新的current
。
这两棵树通过 alternate
属性互相连接:
workInProgress.alternate === current; // 双向连接
current.alternate === workInProgress;
2. 双缓存的优点
- 异步更新:React 可以在后台安全地构建
workInProgress
,不影响当前界面。 - 性能优化:仅在
workInProgress
完成后切换为current
,最大限度减少渲染期间的 DOM 操作。 - 错误恢复:在更新失败时,可以直接回退到
current
树,不影响用户体验。
二、Fiber 树的结构
每个 Fiber 节点代表一个 React 元素(如组件、DOM 节点、文本节点等),其结构如下:
const fiberNode = {type, // 节点类型,例如 'div' 或组件函数tag, // 节点标签,表示是 DOM 节点、函数组件还是类组件key, // 用于列表比较的唯一标识stateNode, // 真实 DOM 节点或类组件实例child, // 第一个子 Fiber 节点sibling, // 下一个兄弟 Fiber 节点return, // 父 Fiber 节点alternate, // 指向当前树中的对应 Fiber 节点effectTag, // 表示需要对节点执行的操作类型(如插入、删除、更新)updateQueue, // 存储该节点的更新队列
};
三、Fiber 树的构建过程
1. 初始化阶段
当 React 首次渲染时,React 会根据 React.createElement
的返回值生成初始 Fiber 树(即 current
树)。
步骤:
-
创建根 Fiber 节点:React 为
ReactDOM.createRoot
创建一个rootFiber
,作为根节点。const rootFiber = {tag: 'HostRoot', // 根 Fiber 的标签stateNode: container, // 指向挂载的 DOM 容器child: null, // 根 Fiber 的子节点 };
-
递归生成 Fiber 树:
- 对根组件调用
beginWork
。 - 根据返回的 React 元素,递归生成子 Fiber 节点并连接父子关系。
- 对根组件调用
2. 更新阶段(使用双缓存)
当组件状态或属性发生变化时,React 会在 workInProgress
树上进行更新操作。
步骤解析:
(1) 创建 workInProgress
树
-
React 会复用
current
树中的大部分 Fiber 节点,通过alternate
连接生成workInProgress
树:const workInProgress = current.alternate || createNewFiber(current);
-
如果存在
current.alternate
,表示已存在workInProgress
,React 会复用它;否则,创建一个新的 Fiber 节点。
(2) 调用 beginWork
构建 Fiber 树
React 的协调逻辑从根节点开始,递归调用 beginWork
构建或更新每个 Fiber 节点。
beginWork
的核心任务:
-
检查更新类型:
- 如果节点没有变化,复用
current
。 - 如果有变化,创建新的 Fiber 节点。
- 如果节点没有变化,复用
-
调用子组件或函数组件的
render
方法,生成新的子 React 元素。 -
调用
reconcileChildren
比较子节点,生成或复用子 Fiber 节点,并连接到当前 Fiber 节点。
示例:
对于以下 JSX:
function App() {return (<div><p>Hello, World!</p></div>);
}
beginWork
的流程:
- 对
<div>
节点创建 Fiber。 - 调用
reconcileChildren
处理子节点<p>
。 - 对
<p>
节点创建或复用 Fiber。
(3) 完成 completeWork
阶段
当 Fiber 树的所有节点完成构建后,React 进入 completeWork
阶段:
- 为每个 Fiber 节点生成对应的真实 DOM 节点(如果是原生节点)。
- 将子节点的 DOM 节点挂载到父节点的
stateNode
上。
3. 提交阶段
当 workInProgress
树构建完成后,React 会进入提交阶段(Commit Phase):
切换 Fiber 树
- 将
workInProgress
树设置为新的current
树:root.current = workInProgress;
执行 DOM 操作
- 根据 Fiber 节点的
effectTag
,执行插入、删除或更新 DOM 的操作。
四、Fiber 树构建的性能优化
-
优先级调度:
- React 根据任务优先级(如用户交互任务 vs 数据更新任务)灵活地分片处理 Fiber 节点。
- 高优先级任务(如用户输入)可打断低优先级任务。
-
复用机制:
- Fiber 节点通过
alternate
实现复用,避免重复创建。 - 对于未变更的节点,直接复用。
- Fiber 节点通过
-
Key 对比:
- 在
reconcileChildren
中,通过key
提升子节点的匹配效率,减少不必要的节点销毁和重建。
- 在
-
最小化 DOM 操作:
- React 在
workInProgress
树中完成所有计算,仅在提交阶段操作 DOM。
- React 在
五、总结
-
React 的 Fiber 树通过双缓存机制实现:
current
树:表示当前屏幕显示的状态。workInProgress
树:在后台异步构建的新状态树。- 它们通过
alternate
属性连接,更新完成后切换树的角色。
-
构建 Fiber 树的过程包括:
beginWork
阶段:生成或复用 Fiber 节点,递归处理子节点。completeWork
阶段:完成 DOM 节点创建并挂载子 DOM。- 提交阶段:执行 DOM 操作并切换 Fiber 树。
-
Fiber 的设计提升了 React 的性能,使其能高效处理复杂更新任务和交互。
相关文章:
React中Fiber树构建过程详解——react中render一个App组件(包含子组件)的流程详解
在 React 中,渲染一个包含子组件的组件涉及一系列底层流程,包括构建虚拟 DOM(React Element)、协调(Reconciliation)、Fiber 树管理和最终的 DOM 操作。以下是一个从底层解析的详细流程: 1. 初始…...
机器学习赋能的智能光子学器件系统研究与应用
在人工智能与光子学设计融合的背景下,科研的边界持续扩展,创新成果不断涌现。从理论模型的整合到光学现象的复杂模拟,从数据驱动的探索到光场的智能分析,机器学习正以前所未有的动力推动光子学领域的革新。据调查,目前…...
晨辉面试抽签和评分管理系统之七:面试成绩核算的三种方式
晨辉面试抽签和评分管理系统(下载地址:www.chenhuisoft.cn)是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…...
语音合成的预训练模型
语音合成的预训练模型 与 ASR(语音识别)和音频分类任务相比,语音合成的预训练模型检查点明显较少。在 Hugging Hub 上,可以找到近 300 个适合的检查点。 在这些预训练模型中,重点关注两种在 Huggingface Transformers 库中开箱即用的架构——SpeechT5 和 Massive Multili…...
Windows怎么搭建rust环境?
在Windows上搭建Rust开发环境相对简单,主要步骤如下: ### 1. 安装Rust 最简单的方法是使用官方提供的安装脚本。打开命令提示符(Command Prompt)或PowerShell,然后运行以下命令来下载并安装Rust: bash cu…...
【Flink】Flink内存管理
Flink内存整体结构图: JobManager内存管理 JVM 进程总内存(Total Process Memory)Flink总内存(Total Flink Memory):JVM进程总内存减去JVM Metaspace(元空间)和JVM Overhead(运行时开销)上图解释: JVM进程总内存为2G;JVM运行时开销(JVM Overh…...
React方向:react中5种Dom的操作方式
1、通过原生JS获取Dom去操作 通过document.querySelector(#title)原生js的方式去拿到dom节点,然后去进行操作。 import {Component} from "react";class App extends Component {//定义获取Dom的函数handleGetDom(){let title document.querySelector(#t…...
K8s数据存储之详解(Detailed Explanation of K8s Data Storage)
K8s数据存储相关概念详解(临时存储,节点存储,网络存储,PV/PVC) 本篇文章分享一下存储卷和数据持久化的相关概念: 存储卷概述 临时存储卷(Ephemeral Volumes) 节点存储卷ÿ…...
PyTorch 中的 Dropout 解析
文章目录 一、Dropout 的核心作用数值示例:置零与缩放**训练阶段****推理阶段** 二、Dropout 的最佳使用位置与具体实例解析1. 放在全连接层后2. 卷积层后的使用考量3. BatchNorm 层与 Dropout 的关系4. Transformer 中的 Dropout 应用 三、如何确定 Dropout 的位置…...
计算机网络 (41)文件传送协议
前言 一、文件传送协议(FTP) 概述: FTP(File Transfer Protocol)是互联网上使用得最广泛的文件传送协议。FTP提供交互式的访问,允许客户指明文件的类型与格式(如指明是否使用ASCII码࿰…...
AOSP 14及以上userdebug无法调试的问题
参考链接:原文...
【Vue】点击侧边导航栏,右侧main对应显示
需求:点击侧边导航栏,右侧main对应显示 通过v-if或v-show等指令来控制不同内容的显示隐藏来实现 注意: 使用v-if时候进行导航栏切换,右侧显示区域可能会出现样式错乱;使用v-show则不会出现此错误 <template>&…...
Python Selenium 库学习指南
Python Selenium 库学习指南 目录 Selenium 基础介绍 Selenium 是什么安装 SeleniumSelenium 的工作原理 Selenium 基本用法 启动浏览器定位元素常见操作:点击、输入、滚动 高级用法 切换窗口与标签页模拟鼠标操作与键盘输入动态加载的网页处理 等待机制 显式等待…...
如何解决Webview和H5缓存问题,确保每次加载最新版本的资源
WebView 用于加载 H5 页面是常见的做法,它能够加载远程的 HTML、CSS、JavaScript 资源,并且让 Web 应用嵌入到原生 App 中。然而,WebView 的缓存机制有时会导致用户看到的是旧版本的页面或资源,尤其是在 H5 发版后,iOS…...
costmap 中点与多边形的相对位置关系
一、背景 近期在阅读move_base源码costmap部分(感觉想玩转movebase导航,costmap必须理解呀)。读到两处点与多边形的相对位置关系。在此总结一下,分别是: intersects: 利用待测点向右引出的射线与多边形的交点数来确定相对位置。有的称 射线交叉算法&am…...
C#与Vue2上传下载Excel文件
1、上传文件流程:先上传文件,上传成功,返回文件名与url,然后再次发起请求保存文件名和url到数据库 前端Vue2代码: 使用element的el-upload组件,action值为后端接收文件接口,headers携带session信…...
.NetCore 使用 NPOI 读取带有图片的excel数据
在.NetCore使用NPOI插件进行批量导入时,获取Excel中的所有的图片数据,存到集合中。 1.定义类PictureData 代码如下: public class PictureData { public byte[] Data { get; set; } } 2.数据集引用 using NPOI.XSSF.UserModel; usin…...
鸿蒙打包发布
HarmonyOS应用/元服务发布(打包发布) https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/ide-publish-app-V13?catalogVersionV13 密钥:包含非对称加密中使用的公钥和私钥,存储在密钥库文件中,格式…...
C++并发编程之跨应用程序与驱动程序的单生产者单消费者队列
设计一个单生产者单消费者队列(SPSC队列),不使用C STL库或操作系统原子操作函数,并且将其放入跨进程共享内存中以便在Ring3(用户模式)和Ring0(内核模式)之间传递数据,是一…...
22、PyTorch nn.Conv2d卷积网络使用教程
文章目录 1. 卷积2. python 代码3. notes 1. 卷积 输入A张量为: A [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ] \begin{equation} A\begin{bmatrix} 0&1&2&3\\\\ 4&5&6&7\\\\ 8&9&10&11\\\\ 12&13&14&15 \end{b…...
智汇云舟参编《城市轨道交通安全防范系统技术要求》国标正式发布
近日,根据国家标准化管理委员会官网,全国标准信息公共服务平台发布的公告,国家标准《城市轨道交通安全防范系统技术要求》(GB/T 26718-2024)已由全国城市轨道交通标准化技术委员会上报国家标准化管理委员会,…...
C# 数据拟合教程:使用 Math.NET Numerics 的简单实现
C# 数据拟合实战:使用 Math.NET Numerics 快速实现 引言 在科学计算、工程建模或数据分析中,数据拟合是一个非常重要的技术。无论是线性拟合还是非线性拟合,借助适当的工具都可以快速解决问题。本文将向您展示如何使用 C# 和强大的数值计算…...
WEB攻防-通用漏洞_XSS跨站_权限维持_捆绑钓鱼_浏览器漏洞
目录 XSS的分类 XSS跨站-后台植入Cookie&表单劫持 【例1】:利用beef或xss平台实时监控Cookie等凭据实现权限维持 【例2】:XSS-Flash钓鱼配合MSF捆绑上线 【例3】:XSS-浏览器网马配合MSF访问上线 XSS的分类 反射型(非持久…...
瑞芯微 RK 系列 RK3588 使用 ffmpeg-rockchip 实现 MPP 视频硬件编解码-代码版
前言 在上一篇文章中,我们讲解了如何使用 ffmpeg-rockchip 通过命令来实现 MPP 视频硬件编解码和 RGA 硬件图形加速,在这篇文章,我将讲解如何使用 ffmpeg-rockchip 用户空间库(代码)实现 MPP 硬件编解码。 本文不仅适…...
MySQL数据库(SQL分类)
SQL分类 分类全称解释DDLData Definition Language数据定义语言,用来定义数据库对象(数据库,表,字段)DMLData Manipulation Language数据操作语言,用来对数据库表中的数据进行增删改DQLData Query Languag…...
SpringBoot-Day1
1.Springboot入门 创建Maven工程 导入spring-boot-stater-web起步依赖 编写Controller 提供启动类 2.yml配置信息书写与获取 书写 # 发件人信息 email:user: 172349823457qq.comcode: sajdajlwhjfgfkllwhost: smtp.qq.comauth: true # 学生爱好 hobbies:- 打篮球- 踢…...
【JavaScript】基础内容,HTML如何引用JavaScript, JS 常用的数据类型
HTML 嵌入 Javascript 的方式 引入外部 js 文件 <head> <script Language "javaScript" src"index.js"/> </head>内部声明 <head> <script language"javascript">function hello(){alert("hello word&qu…...
mysql中创建计算字段
目录 1、计算字段 2、拼接字段 3、去除空格和使用别名 (1)去除空格 (2)使用别名:AS 4、执行算术计算 5、小结 博主用的是mysql8 DBMS,附上示例资料: 百度网盘链接: https://pan.baidu.co…...
如何优化zibll子比主题SEO并设置有效robots文件
如果你不知道 robots.txt 是什么,也不确定如何正确地设置它,本篇文章会向您介绍适用于子比主题的 robots.txt 文件,利用它可以提升 SEO 的效果,避免收录无关页面,从而解决网站被收录但无权重的困境。 作为一款高效的 …...
线程间通信
线程间通信(Inter-Thread Communication, 简称ITC)是指在多线程编程中,不同线程之间如何交换信息或协调彼此的行为。良好的线程间通信机制是构建高效、可靠的并发程序的关键。Java语言提供了多种内置工具和库来支持线程间的通信,包…...
【实践】操作系统智能助手OS Copilot新功能测评
一、引言 数字化加速发展,尤其人工智能的发展速度越来越快。操作系统智能助手成为提升用户体验与操作效率的关键因素。OS Copilot借助语言模型,人工智能等,对操作系统的自然语言交互操作 推出很多功能,值得开发,尤其运…...
今年的电商年货节,主流的营销策略是怎样?
随着一年的年关将近,新一年的CNY营销也逐渐拉开帷幕。考虑到此时消费需求的膨胀,这个时间不论对于线上还是线下市场而言,都是重要的营销节点。今年CNY营销,电商平台上的主流营销策略是这样?就让我们来简单了解下概况。…...
Java设计模式——单例模式(特性、各种实现、懒汉式、饿汉式、内部类实现、枚举方式、双重校验+锁)
文章目录 单例模式1️⃣特性💪单例模式的类型与实现:类型懒汉式实现(线程不安全)懒汉式实现(线程安全)双重锁校验懒汉式(线程安全)饿汉式实现(线程安全)使用类的内部类实现⭐枚举方式实现单例(推荐)👍 单例…...
基于 Python 的学生成绩管理系统设计与实现
标题:基于 Python 的学生成绩管理系统设计与实现 内容:1.摘要 摘要:本文介绍了一个基于 Python 的学生成绩管理系统的设计与实现。该系统旨在提高学生成绩管理的效率和准确性,方便教师和学生进行成绩查询和分析。本文详细描述了系统的设计思路、功能模块…...
局域网共享文件夹实现两台Windows电脑之间传输文件
文章目录 1. 启用网络发现和文件共享2. 设置共享文件夹3. 记录主电脑的IP地址4. 在第二台电脑访问共享文件夹5. 故障排查6. 启用文件共享未生效方案1:检查服务状态方案2:检查防火墙设置方案3:检查网络类型方案4:使用“管理员命令提…...
JS的事件循环机制
<script>setTimeout(()>{console.log(1)},1000)setTimeout(()>{console.log(2)},3000)var start Date.now();while ( (Date.now() - start) < 10000 ){}console.log(3)</script>执行如下代码会发现先打印3,再打印1 再打印2。 现象本质还是因为…...
《自动驾驶与机器人中的SLAM技术》ch9:自动驾驶车辆的离线地图构建
目录 1 点云建图的流程 2 前端实现 2.1 前端流程 2.2 前端结果 3 后端位姿图优化与异常值剔除 3.1 两阶段优化流程 3.2 优化结果 ① 第一阶段优化结果 ② 第二阶段优化结果 4 回环检测 4.1 回环检测流程 ① 遍历第一阶段优化轨迹中的关键帧。 ② 并发计算候选回环对…...
环境搭建——Mysql、Redis、Rocket MQ部署
前言 在搭建分布式系统时,MySQL、Redis 和 RocketMQ 是常用的基础服务。每个服务各自的功能不同,但它们在数据存储、缓存、消息队列等方面不可或缺。如果你是初学者,别担心,本文会一步步详细教你如何在服务器上通过 Docker 部署这…...
Pycharm连接远程解释器
这里写目录标题 0 前言1 给项目添加解释器2 通过SSH连接3 找到远程服务器的torch环境所对应的python路径,并设置同步映射(1)配置服务器的系统环境(2)配置服务器的conda环境 4 进入到程序入口(main.py&#…...
git的基本操作
创建分支: 1,拉去develop代码; 2,git checkout develop切换到develop; 3,git branch lyb/lyb_develop ; 4,git push --set-upstream origin lyb/lyb_develop 切换分支,上…...
Linux软件包管理工具概览
目录 RPM(RedHat Package Manager) DPKG(Debian Packager) APT(Advanced Package Tool) YUM(Yellowdog Updater, Modified) DNF(Dandified YUM) 总结 在…...
unity学习16:unity里向量的计算,一些方法等
目录 1 unity里的向量: 2 向量加法 2.1 向量加法的几何意义 2.2向量加法的标量算法 3 向量减法 3.1 向量减法的几何意义 3.2 向量减法的标量算法 4 向量的标量乘法 5 向量之间的乘法要注意是左乘 还是右乘 5.1 注意区别 5.2 向量,矩阵&#x…...
HTML拖拽功能(纯html5+JS实现)
1、HTML拖拽--单元行拖动 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><…...
w158医院资源管理系统的设计与实现
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...
【计算机网络】lab3 802.11 (无线网络帧)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀计算机网络_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2.…...
linux进程
课本概念:程序的⼀个执行实例,正在执行的程序等内核观点:担当分配系统资源(CPU时间,内存)的实体。 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合.课本上称之为PCB&…...
pytest-allure框架简单封装----测试报告
安装allure-commandline---可以支持allure命令 把对应的压缩包解压后,把xxx/bin配置到环境变量的path去 可以输入allure -version检查版本 pip install allure-pytest2.11.1 生成测试报告 import pytest pytest_args ["-s","-v","--capturesys…...
【2025最新计算机毕业设计】基于SpringBoot+Vue奶茶点单系统(高质量源码,提供文档,免费部署到本地)
作者简介:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容:🌟Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…...
HTML中最基本的东西
本文内容的标签,将是看懂HTML的最基本之基本 ,是跟您在写文章时候一样内容。一般想掌握极其容易,但是也要懂得如何使用,过目不忘,为手熟尔。才是我们学习的最终目的。其实边看边敲都行,或者是边看边复制粘贴…...
Open FPV VTX开源之ardupilot配置
Open FPV VTX开源之ardupilot配置 1. 源由2. 配置3. 总结4. 参考资料5. 补充5.1 飞控固件版本5.2 配置Ardupilot的BF OSD5.3 OSD偏左问题 1. 源由 飞控嵌入式OSD - ardupilot配置使用ardupliot配套OSD图片。 Choose correct font depending on Flight Controller SW. ──>…...