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

React中ElementFiber对象、WorkInProgress双缓存、ReconcileRenderCommit、第一次挂载过程详解

基础概念

在这里插入图片描述

Element对象与Fiber对象

Element对象与Fiber对象
在这里插入图片描述

Element 对象

定义
React 的 Element 对象是一个描述用户界面(UI)的普通 JavaScript 对象,通常由 React.createElement 或 JSX 语法生成。

作用

  • 它是 React 应用中的一种描述 UI 的不可变数据结构
  • 表示一个虚拟 DOM 节点,是 React 处理 UI 的起点。

结构
一个典型的 React Element 对象结构如下:

const element = {type: 'div',          // 节点类型(字符串或组件类型)props: {              // 属性children: [         // 子元素{ type: 'span', props: { children: 'Hello' } },{ type: 'button', props: { children: 'Click me' } }]},key: null,            // 用于唯一标识同一层级的节点ref: null             // 引用
};

特点

  • 不可变性:一旦创建就不能修改。如果需要更新界面,React 会创建新的 Element 对象。
  • 轻量级:它仅包含描述界面的必要信息。

Fiber 对象

定义
Fiber 是 React 16 引入的一种数据结构,用于描述组件的更新单元,它可以被认为是 React 的一种“工作单元”(unit of work)。

作用

  • 它是 React 中调度和协调的核心,用于追踪组件的更新状态
  • 用于支持 React 的可中断渲染特性(Time Slicing 和 Concurrent Mode)。

结构
一个 Fiber 对象包含了非常多的属性,用于追踪组件的状态和更新过程。常见结构如下:

const fiber = {tag: 5,                     // 节点类型(HostComponent、ClassComponent 等)key: 'unique-key',          // 唯一标识type: 'div',                // 节点的类型,与 Element 的 type 类似stateNode: domElement,      // 对应的 DOM 节点(如果是原生元素)return: parentFiber,        // 父 Fiber 节点child: firstChildFiber,     // 子 Fiber 节点sibling: nextSiblingFiber,  // 兄弟 Fiber 节点alternate: oldFiber,        // 双缓冲机制中的旧 FibermemoizedProps: currentProps,// 上一次渲染的 propsmemoizedState: currentState,// 上一次渲染的 stateupdateQueue: updates,       // 更新队列
};

特点

  • 动态可变:Fiber 对象会随着更新而变化,并在内存中保留更新的状态。
  • 连接性强:每个 Fiber 都有指向父节点、子节点和兄弟节点的指针。
  • 性能优化:Fiber 提供了双缓冲机制,通过 currentalternate 双链表,优化了渲染和更新的效率。

Element 对象与 Fiber 对象的关系

  1. 创建

    • React 在渲染时,根据 JSX 或 React.createElement 创建 Element 对象。
    • React 的协调(Reconciliation)过程会将 Element 转换成 Fiber 对象。
  2. 作用范围

    • Element 描述的是组件树的静态结构。
    • Fiber 描述的是组件树的动态工作单元,包含状态、更新和副作用等信息。
  3. 更新机制

    • 当状态或属性变化时,React 会生成新的 Element 对象。
    • Fiber 会根据新的 Element 对象,通过 Diff 算法对比并生成新的 Fiber 树,最终将变化反映到 DOM。

总结

特性Element 对象Fiber 对象
定义UI 描述的不可变对象用于描述组件树状态和调度的工作单元
生成方式React.createElement 或 JSX由协调过程生成
是否可变不可变可变
用途描述界面结构追踪组件状态和更新
层级描述静态的 React 虚拟 DOM 树处理动态的 Fiber 工作树

Fiber 是 React 内部实现的一部分,开发者通常无需直接操作,而是通过 React 的声明式 API(如 JSX 和 hooks)间接影响 Fiber 树的构建和更新。

FiberRootNode与HostRootFiber

在这里插入图片描述
在 React 中,FiberRootNodeHostRootFiber 是 React 内部实现的两个核心概念。它们在 React 的渲染和更新过程中扮演不同的角色,但彼此紧密关联。


1. FiberRootNode

定义

  • FiberRootNode 是 React 应用的根节点,用于管理整个 React 应用的渲染状态。
  • 它是一个表示应用根部的对象,通常对应于一个 React 渲染器(如 DOM 渲染器)的根容器(如 document.getElementById('root'))。

作用

  • 持有与 React 渲染相关的全局状态。
  • 是 React 树的入口,包含指向根 Fiber 节点的引用(即 HostRootFiber)。
  • 维护 React 树的更新调度。

结构
以下是 FiberRootNode 的核心属性:

const FiberRootNode = {containerInfo: domContainer,     // DOM 容器,比如 <div id="root">current: HostRootFiber,          // 指向当前 Fiber 树的根 Fiber 节点pendingLanes: 0,                 // 所有等待调度的更新任务finishedWork: null,              // 已完成的 Fiber 树callbackNode: null,              // 当前调度的任务callbackPriority: NoPriority,    // 当前任务的优先级eventTimes: [],                  // 记录各任务的触发时间
};

特点

  1. 全局管理:FiberRootNode 是 React 应用的全局入口,它是整个 React 渲染逻辑的起点。
  2. 连接 Fiber 树current 属性指向 HostRootFiber,它是连接到 Fiber 树的桥梁。
  3. 任务调度:包含任务优先级(pendingLanescallbackNode)和状态管理信息。

2. HostRootFiber

定义

  • HostRootFiber 是 Fiber 树的根节点(Root Fiber),直接挂载在 FiberRootNode 的 current 属性上。
  • 它是 Fiber 树中的第一个 Fiber 节点,对应整个应用的根组件。

作用

  • 表示 React 应用的顶级组件,是 React 渲染和协调过程的起点。
  • 持有整个应用的状态信息(如 Props、State 和更新队列)。

结构
HostRootFiber 是 Fiber 对象的一个实例,拥有以下关键属性:

const HostRootFiber = {tag: 3,                        // 表示节点类型为 HostRootstateNode: FiberRootNode,      // 指向 FiberRootNode,形成双向关联memoizedState: {               // 应用的状态element: AppElement          // 应用根组件生成的 React 元素},updateQueue: {                 // 更新队列,存储状态的变化shared: {pending: null              // 指向等待处理的更新}},child: AppFiber,               // 指向应用根组件的 Fiber 节点return: null,                  // 根节点没有父节点
};

特点

  1. Fiber 树的起点:它是整个 Fiber 树的根节点,代表 React 应用的根组件。
  2. 双向关联stateNode 指向 FiberRootNode,而 FiberRootNode 的 current 又指回 HostRootFiber。
  3. 应用状态管理:负责存储应用的顶级状态和更新逻辑。

3. FiberRootNode 与 HostRootFiber 的关系
  1. 从属关系

    • FiberRootNode 是全局应用的根节点,持有全局的状态和调度信息。
    • HostRootFiber 是 Fiber 树的根节点,代表应用的根组件,并存储应用状态。
    • FiberRootNode 的 current 属性指向 HostRootFiber,形成直接关联。
  2. 渲染过程

    • React 初始化时会创建 FiberRootNode 和 HostRootFiber。
    • FiberRootNode 的 containerInfo 是实际的 DOM 容器(如 #root),而 HostRootFiber 会逐步构建子 Fiber 节点,最终对应真实的 DOM 节点。
  3. 更新过程

    • 更新从 FiberRootNode 的调度开始。
    • FiberRootNode 会触发调度,并通过 current 指向的 HostRootFiber 开始协调和渲染更新。

4. 关系示意图
FiberRootNode├── containerInfo → <div id="root">  (DOM 容器)├── current → HostRootFiber          (根 Fiber 节点)├── child → AppFiber            (应用根组件的 Fiber)├── child → ComponentFiber (组件的子节点)

5. 总结
特性FiberRootNodeHostRootFiber
定义应用的根节点,管理全局状态和调度Fiber 树的根节点,代表应用的根组件
主要作用维护全局状态、任务调度、连接 Fiber 树存储应用状态、更新逻辑和子节点
关联性current 属性指向 HostRootFiberstateNode 指向 FiberRootNode
具体场景对应 React 应用的 DOM 容器对应 React 应用的顶级组件

FiberRootNode 是全局调度的核心,而 HostRootFiber 是组件树的根节点。两者紧密配合,共同完成 React 的渲染和更新流程。

WorkInProgress双缓存机制

React双缓存
在这里插入图片描述

React 的 WorkInProgress 双缓存机制 是 React Fiber 架构中优化渲染性能的核心设计之一。这种机制通过维护两棵 Fiber 树(current 树workInProgress 树),以实现高效的更新与回溯。

1. 什么是双缓存机制?

双缓存机制的核心是:

  • 两棵 Fiber 树:React 在内存中同时维护两棵 Fiber 树:
    • current 树:表示当前已经渲染并展示在屏幕上的 UI 对应的 Fiber 树。
    • workInProgress 树:用于计算下一次更新的 Fiber 树,它是 current 树 的备份。
  • 当更新完成后,React 会将 workInProgress 树 替换为 current 树

这种设计让 React 可以:

  1. 保证更新过程是安全的,即不会直接修改当前树,从而避免 UI 崩溃。
  2. 实现高效的增量更新,只更新变化的部分。

2. 双缓存机制的核心流程
2.1 树的创建和切换
  1. 初次渲染

    • React 创建一个 Fiber 树,称为 current 树
    • 在初次渲染中,workInProgress 树 是通过克隆 current 树 创建的。
  2. 更新过程

    • 当触发更新时(如 state 或 props 变化),React 会基于 current 树 构建一个 workInProgress 树
    • React 在 workInProgress 树 中执行更新逻辑,并计算新状态。
  3. 提交阶段

    • 更新完成后,React 会将 workInProgress 树 替换为新的 current 树,并将计算的 UI 更新同步到 DOM。
2.2 数据结构的切换

每个 Fiber 节点都有一个 alternate 属性,用于连接 current 树和 workInProgress 树。
这种双向指针的设计允许 React 在两棵树之间快速切换。

const fiber = {tag: 5,alternate: workInProgressFiber,  // 指向对应的 workInProgress 节点
};
  • current 树中的 Fiber 节点通过 alternate 指向对应的 workInProgress 树 节点。
  • workInProgress 树中的 Fiber 节点通过 alternate 指向对应的 current 树 节点。
2.3 优化更新
  • 如果某个节点未发生变化(propsstate 未变化),React 会复用 current 树 中对应的节点,而不是重新创建 Fiber 节点。
  • 这种机制显著减少了内存分配和垃圾回收的开销,提高了性能。

3. 双缓存机制的具体实现
3.1 创建 WorkInProgress 树

React 的 createWorkInProgress 函数用于生成 workInProgress 树。其核心逻辑如下:

  1. 检查 current 树 的 Fiber 节点是否已有 alternate(即对应的 workInProgress 节点)。
    • 如果存在,直接复用并更新属性。
    • 如果不存在,创建一个新的 Fiber 节点并与 current 节点建立双向连接。
function createWorkInProgress(current, pendingProps) {let workInProgress = current.alternate;if (workInProgress === null) {// 没有对应的 workInProgress,创建新节点workInProgress = {...current,alternate: current,};current.alternate = workInProgress;}// 更新节点的 props 和其他状态workInProgress.pendingProps = pendingProps;return workInProgress;
}
3.2 提交阶段

在完成所有更新后,React 会将 workInProgress 树 替换为 current 树。具体操作包括:

  1. workInProgress 树 中的所有变更应用到真实的 DOM。
  2. workInProgress 树 指定为新的 current 树

4. 双缓存机制的优势
4.1 安全性

由于 React 在 workInProgress 树 中执行更新,而非直接修改 current 树,即使更新中断或失败,current 树 仍然保持不变,用户不会看到不完整的 UI。

4.2 性能优化

双缓存机制避免了每次更新都重新构建整个 Fiber 树。通过复用未变化的节点,React 显著减少了内存分配和回收。

4.3 支持并发渲染

React 的双缓存机制为其支持 并发渲染(Concurrent Mode) 提供了基础:

  • React 可以在 workInProgress 树 中进行异步更新,而不会阻塞主线程。
  • 如果高优先级任务插入(如用户输入事件),React 可以随时中断 workInProgress 树 的更新,而无需担心 UI 崩溃。

5. 双缓存机制的缺点
  1. 内存开销
    • 双缓存需要在内存中同时维护两棵 Fiber 树(currentworkInProgress),内存占用较高。
  2. 实现复杂性
    • 双缓存的实现需要维护大量的指针和更新逻辑,代码复杂度较高。

6. 总结

React 的双缓存机制通过维护 current 树workInProgress 树,实现了以下功能:

  1. 提高渲染和更新的安全性。
  2. 提供性能优化(复用未变化的节点)。
  3. 支持并发渲染,响应更流畅的用户交互。

双缓存机制虽然在实现上较为复杂,但它是 React 高效更新和可中断渲染的重要基础,也是 React Fiber 架构的核心设计之一。

更新、渲染与提交

render阶段(beginWork&completeWork)->commit阶段(commitMutationEffect)
在 React 中,更新渲染提交 是 React Fiber 架构的核心阶段,构成了 React 应用从状态变化到用户界面更新的完整流程。这些阶段在 协调(Reconciliation)渲染 的基础上分工明确,各自承担不同的任务。


1. 阶段划分

React 的更新过程可以分为以下三个阶段:

  1. 更新(Update)阶段

    • 触发更新任务并进行调度。
    • 包括 state、props 或 context 的变化触发更新,生成更新队列并计算优先级。
  2. 渲染(Render)阶段

    • 也称为“协调阶段”。
    • 构建或更新 Fiber 树(workInProgress 树),进行 Diff 比较,标记需要更新的部分。
    • 该阶段是可中断的。
  3. 提交(Commit)阶段

    • 应用 Fiber 树的变更到真实 DOM。
    • 执行副作用(如 DOM 更新、生命周期方法调用、ref 更新等)。
    • 该阶段是不可中断的。

2. 详细流程
2.1 更新(Update)阶段

定义
React 的更新阶段负责触发调度,包括响应用户交互、定时器、事件等。

关键步骤

  1. 触发更新

    • 更新由状态(setState)、属性(props 变化)、上下文(context 变化)或强制更新(forceUpdate)触发。
    • 每次更新会生成一个“更新任务”(Update),并加入到更新队列中。
  2. 任务调度

    • React 会将任务交给调度器(Scheduler),根据任务的优先级(如同步任务、用户交互任务、低优先级任务等)安排执行。
    • 高优先级任务(如用户输入)会打断低优先级任务。
  3. 进入渲染阶段

    • 调度完成后,进入渲染阶段,构建 workInProgress 树

2.2 渲染(Render)阶段

定义
渲染阶段是 React 构建或更新 Fiber 树的过程,决定哪些部分需要更新。这一阶段也被称为“协调阶段”。

特点

  • 这一阶段是纯函数式的,React 不会直接操作 DOM。
  • 可中断,支持优先级调度和时间切片(Time Slicing)。

关键步骤

  1. 构建 workInProgress 树

    • React 基于 current 树 创建或更新 workInProgress 树
    • 如果某个节点未发生变化(propsstate 未变化),React 会复用节点。
  2. Diff 算法

    • React 使用 Diff 算法比较 current 树workInProgress 树,标记需要更新的 Fiber 节点。
  3. 生成更新计划

    • 标记的 Fiber 节点会包含“更新标记”(flags),如:
      • Placement:需要插入的新节点。
      • Update:需要更新的节点。
      • Deletion:需要删除的节点。
  4. 渲染结束

    • 渲染阶段完成后,workInProgress 树 将包含最新的更新信息。
    • 进入提交阶段。

2.3 提交(Commit)阶段

定义
提交阶段将 workInProgress 树 中的变更应用到真实的 DOM 上,并执行副作用。

特点

  • 这一阶段是同步且不可中断的。
  • 所有更新都将在提交阶段被应用到屏幕上。

关键步骤

  1. Before Mutation 阶段

    • 调用生命周期方法(如 getSnapshotBeforeUpdate)。
    • 处理 refs(在 DOM 变更前)。
  2. Mutation 阶段

    • workInProgress 树 的变更应用到 DOM。
    • 包括节点插入、更新、删除等操作。
  3. Layout 阶段

    • 调用生命周期方法(如 componentDidMountcomponentDidUpdate)。
    • 处理布局和副作用(如 useLayoutEffect)。

3. 渲染与提交的对比
特性渲染阶段提交阶段
目的构建更新计划,标记需要更新的节点将变更应用到 DOM,并执行副作用
可中断性可中断不可中断
操作范围虚拟 DOM,workInProgress 树真实 DOM
主要过程构建 Fiber 树、Diff 比较更新 DOM、触发副作用

4. 生命周期与 Hooks 的关联

React 的生命周期方法和 Hooks 在不同阶段被调用:

渲染阶段
  • class 组件
    • render
    • shouldComponentUpdate
  • 函数组件
    • useMemouseStateuseReducer
提交阶段
  • class 组件
    • componentDidMount
    • componentDidUpdate
    • getSnapshotBeforeUpdate
    • componentWillUnmount
  • 函数组件
    • useEffect
    • useLayoutEffect

5. 时间切片与并发模式

在 React 的并发模式中,渲染阶段变得更加灵活:

  1. 时间切片:渲染阶段可以分片执行,每一帧只占用主线程的一部分时间,从而避免阻塞用户交互。
  2. 优先级调度:高优先级任务(如用户输入)可以打断低优先级任务(如渲染更新)。

但提交阶段仍然是不可中断的,保证 UI 的一致性。


6. 总结
阶段主要任务特点
更新阶段接收更新请求,生成更新队列,并调度更新任务调度,确定优先级
渲染阶段构建 Fiber 树,Diff 比较并生成更新计划可中断,操作虚拟 DOM
提交阶段应用变更到 DOM,执行副作用(如生命周期、Effect)不可中断,操作真实 DOM

React 的三阶段模型(更新、渲染、提交)清晰地分离了调度逻辑、UI 计算和 DOM 操作,结合 Fiber 架构和时间切片机制,使得 React 能够高效地响应用户交互,同时保持良好的性能表现和一致性。
在这里插入图片描述

第一次挂载流程详解

React第一次挂载流程详解

Render阶段可大致归为beginWork(递)和completeWork(归)两个阶段

1.beginWork流程(递)

  1. 建立节点的父子以及兄弟节点关联关系
    child return sibling属性
  2. 给fiber节点打上flag标记(当前节点的flag)
    渲染阶段结束fiberRootNode.finishwork=wip,进入就断除

2.completeWork流程(归)
主要执行任务:
1.创建真实dom节点,但是仍在内存中,未渲染到页面
2.处理flag与subtreeFlags标记子树标识,用“|” 位运算处理)
3.建立真实DOM关系,将子元素插入父元素中
completeWork归工作完成,将建立fiberRootNode.finishWork=wip关系,当然进入

Commit阶段

  1. commit工作前又会断掉此关系。(状态机,标识运行状态)
  2. 当commitMutationEffect(commit执行完),将dom渲染到页面中之后
    root.current=finishedWork断开和老节点的联系指向新节点

在这里插入图片描述

相关文章:

React中ElementFiber对象、WorkInProgress双缓存、ReconcileRenderCommit、第一次挂载过程详解

基础概念 Element对象与Fiber对象 Element对象与Fiber对象 Element 对象 定义 React 的 Element 对象是一个描述用户界面&#xff08;UI&#xff09;的普通 JavaScript 对象&#xff0c;通常由 React.createElement 或 JSX 语法生成。 作用 它是 React 应用中的一种描述 …...

【论文阅读】Workload Dependent Performance Evaluation of the Linux 2.6 I/O Schedulers

文章目录 某些背景知识的科普&#xff08;依赖GPT&#xff09;GPT简短总结摘要-Abstract引言-Introduction1 I/O Scheduling and the BIO LayerThe 2.6 Deadline I/O Scheduler2.1 The 2.6 Anticipatory I/O scheduler2.2 The 2.6 CFQ Scheduler2.3 The 2.6 noop I/O scheduler…...

macOS 版本对应 Xcode 版本,以及 Xcode 历史版本下载

注&#xff1a;当前页面的所有Xcode下载链接均为苹果官方下载链接 &#xff0c;点击将直接转至苹果官网下载。❤️❤️❤️ Xcode官网&#xff1a;Xcode Releases | xcodereleases.com Xcode版本Xcode发布时间对应macOS版本macOS SDKsiOS SDKswatchOS SDKstvOS SDKs下载Xcode发…...

量子计算:从薛定谔的猫到你的生活

文章背景 说到量子计算&#xff0c;不少人觉得它神秘又遥不可及。其实&#xff0c;它只是量子物理学的一个“应用小分支”。它的核心在于量子比特的“叠加”和“纠缠”&#xff0c;这些听上去像科幻小说的概念&#xff0c;却为计算世界开辟了一片全新的天地。如果经典计算是“…...

R4-LSTM学习笔记

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 LSTM-火灾温度预测 导入数据数据可视化设置X、y构建模型调用模型个人总结LSTM 的基本结构细胞状态&#xff08;Cell State&#xff09;LSTM 的优点 导入数据 i…...

Facebook 隐私变革之路:回顾与展望

在数字时代&#xff0c;个人隐私的保护一直是社交平台面临的重大挑战之一。作为全球最大的社交网络平台&#xff0c;Facebook&#xff08;现为Meta&#xff09;在处理用户隐私方面的变革&#xff0c;历经了多次调整与完善。本文将回顾Facebook在隐私保护方面的历程&#xff0c;…...

计算机网络 (40)域名系统DNS

前言 计算机网络域名系统DNS&#xff08;Domain Name System&#xff09;是互联网的基础技术之一&#xff0c;它负责将人类可读的域名转换为计算机用来通信的数字IP地址。 一、基本概念 DNS的主要目的是将域名解析或翻译为IP地址&#xff0c;使得用户可以通过简单易记的域名来访…...

LabVIEW驱动电机实现样品自动搜索

利用LabVIEW控制电机驱动相机在XY平面上进行扫描&#xff0c;以检测样品位置。样品最初可能位于相机视野范围之外&#xff0c;需要实现自动搜索样品位置并完成精确定位扫描的功能。该系统需具有以下特点&#xff1a; 高效搜索&#xff1a;能够快速确定样品位置&#xff0c;缩短…...

程序员独立开发竞品分析:确定网站使用什么建站系统

要确定一个网站使用的建站系统&#xff0c;可以通过以下几种方法尝试分析&#xff1a; 查看页面源代码&#xff1a; 打开网站&#xff0c;右键点击页面并选择“查看页面源代码”。在代码中查找一些常见的建站系统标志&#xff0c;例如&#xff1a; WordPress 的迹象&#xff1a…...

计算机网络 笔记 网络层1

网络层功能概述 主要的任务是把分组从源端传输到目的端&#xff0c;为分组交换网上的不同主句提供通信服务&#xff0c;网络层的传输单位是数据报。 主要的功能&#xff1b; 1&#xff0c;路由选择&#xff1a;路由选择指网络层根据特定算法&#xff0c;为数据包从源节点到目…...

推理规则库的构建与应用

目录 前言1. 推理规则库概述1.1 推理规则的基本构成1.2 推理规则库的作用与意义 2. 推理规则库的构建2.1 知识获取与表示2.2 推理规则的提取2.3 规则的优化与整合 3. 推理规则库的推理机制3.1 前向推理3.2 后向推理3.3 混合推理 4. 推理规则库的应用4.1 医学领域4.2 金融领域4.…...

深度学习|表示学习|一个神经元可以干什么|02

如是我闻&#xff1a; 如果我们只有一个神经元&#xff08;即一个单一的线性或非线性函数&#xff09;&#xff0c;仍然可以完成一些简单的任务。以下是一个神经元可以实现的功能和应用&#xff1a; 1. 实现简单的线性分类 输入&#xff1a;一组特征向量 x x x 输出&#xff…...

2 XDMA IP中断

三种中断 1. Legacy 定义&#xff1a;Legacy 中断是传统的中断处理方式&#xff0c;使用物理中断线&#xff08;例如 IRQ&#xff09;来传递中断信号。缺点&#xff1a; 中断线数量有限&#xff0c;通常为 16 条&#xff0c;限制了可连接设备的数量。中断处理可能会导致中断风…...

什么是负载均衡?NGINX是如何实现负载均衡的?

大家好&#xff0c;我是锋哥。今天分享关于【什么是负载均衡&#xff1f;NGINX是如何实现负载均衡的&#xff1f;】面试题。希望对大家有帮助&#xff1b; 什么是负载均衡&#xff1f;NGINX是如何实现负载均衡的&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源…...

AWS简介

AWS 一&#xff0c;AWS是什么&#xff1f; AWS的全称是 Amazon Web Services 的缩写&#xff0c;是亚马逊公司提供的一套广泛且应用广泛的云端服务。 AWS提供了超过200项全功能的服务&#xff0c;来自数据中心数据中心遍布全球多个地理位置&#xff0c;这些服务包括计算能力&…...

旅游网站设计与实现

文末附有完整项目代码 在当今数字化时代&#xff0c;旅游网站成为人们获取旅游信息的重要途径。本文将详细介绍旅游网站的设计与实现&#xff0c;让你轻松了解其中的技术奥秘&#xff01; 一、项目背景 随着社会经济的发展&#xff0c;人们对精神消费愈发重视&#xff0c;旅游…...

vscode 扩展Cline、Continue的差别?

Cline和Continue都是VSCode的AI编程插件&#xff0c;它们在功能、用户体验、性能、适用场景以及配置和使用步骤等方面存在一些差别&#xff1a; 一、功能差异 编辑功能 Cline&#xff1a;能够分析项目的文件结构和源代码抽象语法树&#xff08;AST&#xff09;&#xff0c;通…...

用 HTML5 Canvas 和 JavaScript 实现雪花飘落特效

这篇文章将带您深入解析使用 HTML5 Canvas 和 JavaScript 实现动态雪花特效的代码原理。 1,效果展示 该效果模拟了雪花从天而降的动态场景,具有以下特点: 雪花数量、大小、透明度和下落速度随机。雪花会在屏幕底部重置到顶部,形成循环效果。随窗口大小动态调整,始终覆盖…...

电梯系统的UML文档01

Lu Luo 著&#xff0c;王君 译 1 简介 这是一份Carnegie Mellon 大学博士课程&#xff08;分布式嵌入系统&#xff09;项目报告。整个课程完成了一个分布式实时系统的设计、搭建和模拟。设计时用到了OOA 和OOD&#xff0c;特别是UML。 系统的大多数类省略了很多细节。现在看…...

浅谈云计算04 | 云基础设施机制

探秘云基础设施机制&#xff1a;云计算的基石 一、云基础设施 —— 云计算的根基![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/1fb7ff493d3c4a1a87f539742a4f57a5.png)二、核心机制之网络&#xff1a;连接云的桥梁&#xff08;一&#xff09;虚拟网络边界&#xff…...

数据库知识

存储引擎层面 数据存储格式 不同的存储引擎有不同的数据存储格式。以 InnoDB 和 MyISAM 为例&#xff0c;InnoDB 是面向行的存储引擎&#xff0c;它将数据行存储在聚集索引&#xff08;如果没有显式定义主键&#xff0c;会自动生成一个隐藏的主键&#xff09;中。数据行和索引…...

2025宝塔API一键建站系统PHP源码

源码介绍 2025宝塔API一键建站系统PHP源码&#xff0c;对接自己的支付&#xff0c;虚拟主机也能搭建&#xff0c;小白式建站系统&#xff0c;基于宝塔面板搭建的建站系统&#xff0c;功能丰富&#xff0c;多款模板&#xff0c;每日更新 上传源码到服务器&#xff0c;浏览器访问…...

第三十八章 Spring之假如让你来写MVC——适配器篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…...

客户端渲染和服务端渲染

二者本质的区别&#xff1a;是在哪完成了 HTML 的拼接&#xff0c;服务端渲染是在服务端拼接&#xff0c;客户端渲染是在客户端拼接。 服务端渲染的优缺点 优点 SEO 友好&#xff0c;服务端渲染更有利于爬虫爬取信息。 更快的首屏渲染&#xff0c;因为 HTML 已经在服务端生…...

《盘古大模型——鸿蒙NEXT的智慧引擎》

在当今科技飞速发展的时代&#xff0c;华为HarmonyOS NEXT的发布无疑是操作系统领域的一颗重磅炸弹&#xff0c;其将人工智能与操作系统深度融合&#xff0c;开启了智能新时代。而盘古大模型在其中发挥着至关重要的核心作用。 赋予小艺智能助手超强能力 在鸿蒙NEXT中&#xf…...

软件架构考试基础知识 004:死锁问题

死锁的定义 死锁&#xff08;Deadlock&#xff09;是指在多进程系统中&#xff0c;一组进程相互等待对方持有的资源&#xff0c;导致所有相关进程都无法继续执行的状态。这种状态是僵持的&#xff0c;无法自动解除&#xff0c;必须通过外部干预&#xff08;如重启系统&#xf…...

AI学习路线图-邱锡鹏-神经网络与深度学习

1 需求 神经网络与深度学习 2 接口 3 示例 4 参考资料...

Pytorch通信算子组合测试

Pytorch通信算子组合测试 一.背景二.相关链接三.遇到的问题四.操作步骤1.登录服务器2.查看拓扑3.准备测试用例A.准备目录B.用例代码 4.创建docker容器5.查看当前pytorch版本6.运行测试程序 一.背景 测试pytorch通信算子不同配置下的功能及性能测试不同的group组合测试不同的te…...

Android Dex VMP 动态加载加密指令流

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 上一篇【详解如何自定义 Android Dex VMP 保护壳】实现了 VMP 保护壳。 为了进一步加强对 dex 指令的保护&#xff0c;实现指令流加密和动态加载&#xff0c;…...

深度学习blog-剪枝和知识蒸馏

深度学习网络模型从卷积层到全连接层存在着大量冗余的参数&#xff0c;大量神经元激活值趋近于0&#xff0c;将这些神经元去除后可以表现出同样的模型表达能力&#xff0c;这种情况被称为过参数化。因此需要一些技术手段减少模型的复杂性&#xff0c;去除一些不重要的参数和连接…...

13:00面试,13:08就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到9月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…...

机器学习笔记合集

大家好&#xff0c;这里是好评笔记&#xff0c;公主 号&#xff1a;Goodnote。本笔记的任务是解读机器学习实践/面试过程中可能会用到的知识点&#xff0c;内容通俗易懂&#xff0c;入门、实习和校招轻松搞定。 笔记介绍 本笔记的任务是解读机器学习实践/面试过程中可能会用到…...

七 rk3568 android 11 ec20 4G驱动移植

一 内核驱动集成 参考:Quectel_LTE&5G_Linux_USB_Driver_V1.0.zip EC20 内核驱动有两个版本 ,一个是 qmi_wwan, 一个是 GOBNet , 这里用的是 qmi_wwan版本 1.1 添加 USBNET 驱动文件 将驱动包里的 qmi_wwan_q.c 拷到 kernel/driver/net/usb/ 下 修改 kernel/dr…...

【Elasticsearch7.11】postman批量导入少量数据

JSON 文件内的数据格式&#xff0c;json文件数据条数不要过多&#xff0c;会请求参数过大&#xff0c;最好控制再10000以内。 {"index":{"_id":"baec07466732902d22a24ba01ff09751"}} {"uuid":"baec07466732902d22a24ba01ff0975…...

NLP三大特征抽取器:CNN、RNN与Transformer全面解析

引言 自然语言处理&#xff08;NLP&#xff09;领域的快速发展离不开深度学习技术的推动。随着应用需求的不断增加&#xff0c;如何高效地从文本中抽取特征成为NLP研究中的核心问题。深度学习中三大主要特征抽取器——卷积神经网络&#xff08;Convolutional Neural Network, …...

45_Lua模块与包

Lua中的模块系统是该语言的一个重要特性,它允许开发者将代码分割成更小、更易于管理的部分。通过使用模块,你可以创建可重用的代码片段,并且可以降低代码间的耦合度。下面我将详细介绍Lua模块的基本概念、语法以及一些实际案例。 1.Lua模块 1.1 模块的基本概念 从Lua 5.1…...

软定时器的原理与创建

目录 问题概述 设计原理 设计实现 一个任务来管理所有在指定的时间、以特定的周期触发某种操作的定时需求。 问题概述 在实际应用中&#xff0c;常常需要周期性或者在指定时间做一件事情。 周期性&#xff1a;在指定的延时开始做某件事情&#xff0c;然后周期性重复执行 一次性…...

【自动化测试】—— Appium安装配置保姆教程(图文详解)

目录 一. 环境准备 二. JDK安装 1. 下载JDK 2. 安装JDK 3. 配置环境 4. 验证安装 三. Android SDK安装 1. 下载Android SDK 2. 安装Android SDK 3. 安装工具 4. 配置环境 5. 验证安装 四. NodeJS安装 1. 下载NodeJS 2. 安装NodeJS 3. 验证安装 4. 安装淘宝镜像…...

穿越火线怀旧服预约网页vue3版本

源码下载地址: https://github.com/superBiuBiuMan/crossfire-old-vue3版权来自穿越火线,项目仅供参考学习!!! 效果 源码下载地址: https://github.com/superBiuBiuMan/crossfire-old-vue3预览地址: https://crossfire.123916.xyz/官网效果: https://www.cfhuodong.com/2025-…...

《Keras3从头开始的图像分类》

Keras3从头开始的图像分类 作者&#xff1a;fchollet创建日期&#xff1a;2020/04/27最后修改时间&#xff1a;2023/11/09描述&#xff1a;在 Kaggle Cats vs Dogs 数据集上从头开始训练图像分类器。 &#xff08;i&#xff09; 此示例使用 Keras 3 在 Colab 中查看 • GitHub…...

Apache Hop从入门到精通 第三课 Apache Hop下载安装

1、下载 官方下载地址&#xff1a;https://hop.apache.org/download/&#xff0c;本教程是基于apache-hop-client-2.11.0.zip进行解压&#xff0c;需要jdk17&#xff0c;小伙伴们可以根据自己的需求下载相应的版本。如下图所示 2、下载jdk17&#xff08;https://www.microsoft…...

Vue.js组件开发-图片剪裁性能优化最佳方案实例

在Vue.js组件开发中&#xff0c;优化图片剪裁性能的最佳方案通常涉及多个方面的综合考虑。以下是一个结合多个优化策略的图片剪裁组件性能优化实例&#xff1a; 1. 组件设计 首先&#xff0c;设计一个简洁且高效的图片剪裁组件&#xff0c;确保其功能明确且易于使用。组件应包…...

React - router的使用 结合react-redux的路由守卫

web端使用路由安装的是 react-router-dom "react-router-dom": "^5.2.0"在组件中使用路由&#xff0c;我们先设置2个路由&#xff0c;分别是首页、关于 // src/components/RouteSample.jsimport React from react; // 引入路由需要的基础模块 import {Bro…...

day09_kafka高级

文章目录 kafka高级今日课程内容核心概念整理Kafka的数据位移offset**为什么 Kafka 的 offset 就像是“书签”&#xff1f;****实际意义** Kafka的基准/压力测试测试生产的效率测试消费的效率 Kafka的分片与副本机制kafka如何保证数据不丢失生产者端Broker端消费者端相关参数 K…...

【MT32F006】MT32F006之通信协议

本文最后修改时间&#xff1a;2025年01月09日 一、本节简介 本文介绍如何使用MT32F006写一个通信协议。 二、实验平台 库版本&#xff1a;V1.0.0 编译软件&#xff1a;MDK5.37 硬件平台&#xff1a;MT32F006开发板&#xff08;主芯片MT32F006&#xff09; 仿真器&#xff…...

CMake学习笔记(2)

1. 嵌套的CMake 如果项目很大&#xff0c;或者项目中有很多的源码目录&#xff0c;在通过CMake管理项目的时候如果只使用一个CMakeLists.txt&#xff0c;那么这个文件相对会比较复杂&#xff0c;有一种化繁为简的方式就是给每个源码目录都添加一个CMakeLists.txt文件&#xff…...

访客机的四个功能

访客机&#xff0c;也被称为访客自动登记安全管理系统或访客一体机&#xff0c;是现代安全管理中不可或缺的一部分。它通过整合计算机技术、射频识别技术、指纹生物识别、触摸屏手写技术、文字识别&#xff08;OCR&#xff09;技术、热敏打印技术、条码技术、数码摄像技术、自动…...

【Linux系统】—— vim 的使用

【Linux系统】—— vim 的使用 1 vim 的基本概念2 vim 的多模式3 命令模式下的命令集3.1 进入/退出其他模式3.2 光标移动命令集3.3 复制/剪切/粘贴/删除命令集3.4 撤销命令集3.5 查找命令集3.6 替换命令集3.7 进入与退出替换模式 4 批量化编译5 底行模式6 vim 小技巧7 vim简单配…...

华为C语言编程规范总结

1.头文件更改会导致所有直接或间接包含该头文件的的C文件重新编译&#xff0c;会增加大量编译工作量&#xff0c;延长编译时间&#xff0c;因此&#xff1a; 1.1 头文件里尽量少包含头文件 1.2 头文件应向稳定的方向包含 2.每一个.c文件应有一个同名.h文件&#xff0c…...

深入学习 Python 量化编程

深入学习 Python 量化编程 第一章&#xff1a;Python 基础与量化编程环境搭建 1.1 安装必要的库 首先&#xff0c;你需要安装一些在量化编程中常用的 Python 库。可以通过以下命令安装这些库&#xff1a; pip install numpy pandas matplotlib yfinance backtrader scikit-…...