如何在 React 项目中使用React.lazy和Suspense实现组件的懒加载?
大白话如何在 React 项目中使用React.lazy和Suspense实现组件的懒加载?
在 React 项目里,有时候组件功能多、体积大,要是一次性把所有组件都加载进来,网页加载速度就会变慢。而 React 提供了 React.lazy
和 Suspense
这两个好东西,能让我们实现组件的懒加载,也就是需要用到某个组件的时候再去加载它,这样可以加快网页的初始加载速度。接下来,我就详细说说怎么用这俩来实现组件懒加载。
1. 创建项目
首先,你得有个 React 项目。要是还没有,就可以用下面这个命令快速创建一个:
npx create-react-app lazy-loading-example
cd lazy-loading-example
2. 创建要懒加载的组件
在 src
目录下创建一个新的组件文件,比如叫 LazyComponent.js
,这个组件就是我们要懒加载的对象。下面是这个组件的代码:
// 导入 React 库
import React from 'react';// 定义一个函数组件 LazyComponent
const LazyComponent = () => {// 返回一个包含文本的 div 元素return <div>这是一个懒加载的组件</div>;
};// 导出这个组件,以便其他文件可以使用它
export default LazyComponent;
3. 使用 React.lazy
和 Suspense
实现懒加载
在 src
目录下的 App.js
文件里,我们要使用 React.lazy
和 Suspense
来实现组件的懒加载。下面是具体的代码:
// 导入 React 库,同时引入 React.lazy 和 Suspense
import React, { lazy, Suspense } from 'react';// 使用 React.lazy 动态导入 LazyComponent 组件
// React.lazy 接收一个函数,这个函数返回一个动态导入组件的 Promise
const LazyComponent = lazy(() => import('./LazyComponent'));// 定义 App 函数组件
const App = () => {return (<div><h1>组件懒加载示例</h1>{/* 使用 Suspense 包裹懒加载的组件 */}{/* fallback 属性指定在组件加载过程中显示的内容 */}<Suspense fallback={<div>正在加载组件...</div>}>{/* 渲染懒加载的组件 */}<LazyComponent /></Suspense></div>);
};// 导出 App 组件,作为项目的根组件
export default App;
代码解释
React.lazy
:它就像是一个小助手,专门负责在需要的时候去加载组件。你给它一个函数,这个函数返回一个动态导入组件的Promise
,它就会在合适的时候去加载这个组件。Suspense
:它就像一个缓冲器,在组件加载的过程中,它会显示你设置的fallback
内容,比如“正在加载组件…”,等组件加载好了,再把组件显示出来。
4. 运行项目
最后,用下面的命令启动项目:
npm start
当你打开浏览器访问这个项目的时候,一开始会看到“正在加载组件…”,等组件加载完成,就会看到“这是一个懒加载的组件”。
通过上面这些步骤,你就学会了如何在 React 项目中使用 React.lazy
和 Suspense
实现组件的懒加载啦。这样做可以让你的网页加载速度更快,用户体验也会更好。
除了React.lazy和Suspense,还有哪些实现组件懒加载的方法?
除了 React.lazy
和 Suspense
,以下是几种在 React 里实现组件懒加载的方法:
1. 手动控制导入
可以通过手动管理组件的导入和渲染来实现懒加载。在组件需要渲染的时候,动态地导入相应的组件。
import React, { useState } from 'react';const App = () => {// 用于存储懒加载组件的状态const [LazyComponent, setLazyComponent] = useState(null);// 加载组件的函数const loadComponent = async () => {try {// 动态导入组件const { default: component } = await import('./LazyComponent');// 更新状态以存储导入的组件setLazyComponent(component);} catch (error) {console.error('加载组件时出错:', error);}};return (<div><button onClick={loadComponent}>加载组件</button>{LazyComponent && <LazyComponent />}</div>);
};export default App;
在上述代码中,loadComponent
函数在按钮点击时被调用,它会动态导入 LazyComponent
,并将其存储在状态中。之后,当 LazyComponent
存在于状态中时,就会渲染该组件。
2. 使用第三方库 react-loadable
(旧版)
react-loadable
是一个第三方库,它简化了 React 中组件的懒加载过程。不过需要注意的是,这个库已经不再维护,在 React 16.6 及以后版本中,官方推荐使用 React.lazy
和 Suspense
。
首先,安装 react-loadable
:
npm install react-loadable
然后,使用它来实现懒加载:
import React from 'react';
import Loadable from 'react-loadable';// 定义加载时显示的组件
const LoadingComponent = () => <div>正在加载...</div>;// 使用 react-loadable 创建懒加载组件
const LazyComponent = Loadable({loader: () => import('./LazyComponent'),loading: LoadingComponent,
});const App = () => {return (<div><h1>组件懒加载示例</h1><LazyComponent /></div>);
};export default App;
在这段代码中,Loadable
函数接收一个对象,其中 loader
属性是一个返回动态导入组件的函数,loading
属性指定了在组件加载过程中显示的组件。
3. 基于路由的懒加载
在使用 React Router 进行路由管理时,可以实现基于路由的懒加载。这样当用户访问特定路由时,才加载对应的组件。
import React, { Suspense, lazy } from 'react';
import { BrowserRouter as Router, Routes, Route } from 'react-router-dom';// 懒加载 Home 组件
const Home = lazy(() => import('./Home'));
// 懒加载 About 组件
const About = lazy(() => import('./About'));const App = () => {return (<Router><Suspense fallback={<div>正在加载...</div>}><Routes><Route path="/" element={<Home />} /><Route path="/about" element={<About />} /></Routes></Suspense></Router>);
};export default App;
这里,当用户访问不同的路由时,对应的组件才会被动态加载。Suspense
组件用于在加载过程中显示提示信息。
对比React.lazy和Suspense以及手动控制导入这三种方式的优缺点
以下是对 React.lazy 和 Suspense 以及手动控制导入这三种组件懒加载方式优缺点的对比:
React.lazy 和 Suspense
优点
- 语法简洁:
React.lazy
和Suspense
是 React 官方提供的懒加载解决方案,使用起来语法简洁直观。例如,使用React.lazy
只需一行代码就能定义一个懒加载组件,Suspense
也能很方便地设置加载时的占位内容。
const LazyComponent = lazy(() => import('./LazyComponent'));
<Suspense fallback={<div>Loading...</div>}><LazyComponent />
</Suspense>
- 与 React 生态集成良好:作为 React 官方特性,它能与 React 的其他特性(如 React Router)无缝集成,方便在路由层面实现懒加载,使代码结构更清晰。
const Home = lazy(() => import('./Home'));
<Route path="/" element={<Suspense fallback={<div>Loading...</div>}><Home /></Suspense>
} />
- 自动处理错误和加载状态:
Suspense
可以自动处理组件加载过程中的状态,当组件加载失败时,也可以结合ErrorBoundary
来捕获和处理错误,增强了应用的健壮性。
缺点
- 兼容性依赖 React 版本:
React.lazy
和Suspense
是 React 16.6 及以上版本才支持的特性,如果项目使用的是旧版本的 React,则无法使用该功能。 - 灵活性相对较低:在某些复杂场景下,
React.lazy
和Suspense
的默认行为可能无法满足需求,例如需要更精细地控制组件加载时机。
手动控制导入
优点
- 高度灵活:手动控制导入允许你完全自主地控制组件的加载时机和方式。你可以根据不同的条件(如用户操作、数据加载状态等)来决定何时加载组件,适用于各种复杂的业务场景。
const [LazyComponent, setLazyComponent] = useState(null);
const loadComponent = async () => {const { default: component } = await import('./LazyComponent');setLazyComponent(component);
};
<button onClick={loadComponent}>Load Component</button>
- 兼容性好:这种方式不依赖于特定的 React 版本,只要支持动态导入语法,就可以在任何 React 项目中使用。
缺点
- 代码复杂度高:手动控制导入需要编写更多的代码来管理组件的加载状态和错误处理,代码结构会变得复杂,维护成本较高。
const loadComponent = async () => {try {const { default: component } = await import('./LazyComponent');setLazyComponent(component);} catch (error) {console.error('Failed to load component:', error);// 还需要额外处理错误状态}
};
- 缺乏统一的加载状态管理:不像
Suspense
可以统一管理加载状态和占位内容,手动控制导入需要自己实现加载状态的管理,容易出现不一致的情况。
除了懒加载,还有哪些优化React项目性能的方法?
除了懒加载,以下是一些优化 React 项目性能的常用方法:
1. 虚拟列表
当需要渲染大量数据列表时,一次性渲染所有数据会导致性能问题。虚拟列表只渲染当前可见区域的数据,当用户滚动列表时,动态地加载和渲染新的数据。
import React from 'react';
import { FixedSizeList } from 'react-window';const Row = ({ index, style }) => (<div style={style}>这是第 {index} 行数据</div>
);const App = () => {return (<FixedSizeListheight={400}width={300}itemSize={30}itemCount={1000}>{Row}</FixedSizeList>);
};export default App;
这里使用了 react-window
库的 FixedSizeList
组件,它会根据列表的高度、宽度、每个项的大小和项的总数,只渲染当前可见区域的项。
2. 使用 shouldComponentUpdate
、PureComponent
或 React.memo
shouldComponentUpdate
在类组件中,可以通过 shouldComponentUpdate
生命周期方法来控制组件是否需要重新渲染。通过比较前后的 props
和 state
,决定是否阻止组件的重新渲染。
class MyComponent extends React.Component {shouldComponentUpdate(nextProps, nextState) {// 比较前后的 props 和 state,返回 false 则阻止重新渲染return this.props.someProp!== nextProps.someProp || this.state.someState!== nextState.someState;}render() {return <div>{this.props.someProp}</div>;}
}
PureComponent
PureComponent
是 React 提供的一个基类,它会自动对 props
和 state
进行浅比较,如果没有变化则阻止组件重新渲染。
import React, { PureComponent } from 'react';class MyPureComponent extends PureComponent {render() {return <div>{this.props.someProp}</div>;}
}
React.memo
对于函数组件,可以使用 React.memo
来实现类似的功能。React.memo
是一个高阶组件,它会对组件的 props
进行浅比较,只有当 props
发生变化时才会重新渲染组件。
import React from 'react';const MyFunctionComponent = React.memo((props) => {return <div>{props.someProp}</div>;
});
3. 优化事件处理函数
在 React 中,每次渲染时创建新的事件处理函数会导致不必要的性能开销。可以在类组件的构造函数中绑定事件处理函数,或者使用箭头函数定义事件处理函数。
class MyComponent extends React.Component {constructor(props) {super(props);this.handleClick = this.handleClick.bind(this);}handleClick() {// 处理点击事件}render() {return <button onClick={this.handleClick}>点击我</button>;}
}
4. 优化 CSS 样式
避免使用内联样式,因为内联样式会在每次渲染时重新计算和应用。可以使用 CSS 类名来管理样式,这样浏览器可以更好地缓存和优化样式。
import './styles.css';const MyComponent = () => {return <div className="my-style">这是一个组件</div>;
};
5. 代码分割和打包优化
合理地进行代码分割,将不常用的代码分离到单独的包中,减少初始加载的代码量。可以使用 Webpack 等打包工具的配置来实现代码分割,例如使用动态导入语法。
const loadComponent = async () => {const { default: MyComponent } = await import('./MyComponent');// 使用组件
};
6. 使用 useCallback
和 useMemo
useCallback
useCallback
用于缓存函数,避免在每次渲染时创建新的函数实例。当函数作为 props
传递给子组件时,使用 useCallback
可以避免子组件不必要的重新渲染。
import React, { useCallback } from 'react';const MyComponent = () => {const handleClick = useCallback(() => {// 处理点击事件}, []);return <button onClick={handleClick}>点击我</button>;
};
useMemo
useMemo
用于缓存计算结果,避免在每次渲染时进行重复的计算。当某个计算结果依赖于某些值,并且这些值没有变化时,使用 useMemo
可以直接返回之前的计算结果。
import React, { useMemo } from 'react';const MyComponent = ({ a, b }) => {const sum = useMemo(() => a + b, [a, b]);return <div>总和是: {sum}</div>;
};
相关文章:
如何在 React 项目中使用React.lazy和Suspense实现组件的懒加载?
大白话如何在 React 项目中使用React.lazy和Suspense实现组件的懒加载? 在 React 项目里,有时候组件功能多、体积大,要是一次性把所有组件都加载进来,网页加载速度就会变慢。而 React 提供了 React.lazy 和 Suspense 这两个好东西…...
虫洞数观系列一 | 豆瓣电影TOP250数据采集与MySQL存储实战
目录 系列文章 1. 引言 2 技术栈Request 2.1请求头headers 2.2查找定位信息 2.3处理网页html结构化数据 2.4每页url规律 2.5逐条查找所需信息 2.6完整代码 3 数据存储至mysql 3.1新建数据库 3.2编写数据库写入py文件 3.2.1构建1个执行sql语句的函数 3.2.2构造一个…...
模型 阿米巴模式
系列文章分享模型,了解更多👉 模型_思维模型目录。小团队独立经营,企业活力无限。 1 阿米巴模式的应用 1.1 日航重生(航空业成功案例) 应用领域 航空运输业破产重组与组织激活 案例名称 日本航空(JAL&…...
针对stm32F103C8t6芯片调节USB串口的经验
1、首先这是自己手搓的板子,对于之前一直没有了解过USB这方面,则这个针对USB部分没有设计上拉电阻,造成不管怎么调节PC端都没有反应。 图一 这个没有添加1.5K电阻 这个D+位置应该再接一个1.5KR的电阻如图2所示 图2 这样调节的话PC端就可以识别到USB串口,但是这是串口还是会…...
JVM详解(包括JVM内存模型与GC垃圾回收)
📖前言: 学会使用Java对于一个程序员是远远不够的。Java语法的掌握只是一部分,另一部分就是需要掌握Java内部的工作原理,从编译到运行,到底是谁在帮我们完成工作的? 接下来着重对Java虚拟机,也就…...
解锁DeepSeek潜能:Docker+Ollama打造本地大模型部署新范式
🐇明明跟你说过:个人主页 🏅个人专栏:《深度探秘:AI界的007》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是Docker 2、什么是Ollama 二、准备工作 1、操…...
【Linux网络】——Socket网络编程
前言 在当今数字化的时代,网络通信已经成为计算机领域不可或缺的一部分。无论是日常的网页浏览、社交媒体交互,还是大规模的企业级数据传输,都离不开高效可靠的网络通信。而在Linux操作系统中,Socket网络编程是实现各种网络应用的…...
基于javaweb的SpringBoot雪具商城系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...
Android 简化图片加载与显示——使用Coil和Kotlin封装高效工具类
为了简化使用Coil加载网络图片和GIF的过程,我们可以封装一个工具类。这个工具类将包括初始化ImageLoader的方法、加载图片到ImageView的方法,以及可能的其他便捷方法,如加载圆形图片、设置占位图等。下面是一个示例: 首先&#x…...
Flink watermark的时间字段有空值,建表的时候,如何处理
在 Flink 中处理时间字段存在空值时,需通过 表定义阶段的特殊处理 和 Watermark 生成策略调整 来避免因空值导致的窗口计算异常或任务失败。以下是具体解决方案及实现方法: 1. 空值处理核心策略 1.1 查询时,过滤空值数据(推荐&am…...
关于matlab和python谁快的问题
关于matlab和python谁快的问题,python比matlab在乘法上快10倍,指数计算快4倍,加减运算持平,略慢于matlab。或许matlab只适合求解特征值。 import torch import timen 50000 # 矩阵规模 M torch.rand(n, 31)start_time time.t…...
【DevOps】DevOps and CI/CD Pipelines
DevOps 是一种将开发与运维实践相结合的模式,旨在缩短软件开发周期并交付高质量软件。 DevOps 是什么? 开发团队与运维团队之间的协作 • 持续集成与持续交付(CI/CD) • 流程自动化 • 基础设施即代码(IaC)…...
ROS--IMU数据包
IMU惯性测量单元 一:IMU二:ROS中三:IMU数据包三:总结 提示:以下是本篇文章正文内容,下面案例可供参考 一:IMU IMU(Inertial Measurement Unit,惯性测量单元)…...
【机器学习】手撕封装PCA——将高维数据映射到低维数据的过程
PCA将高维数据映射到低维数据的过程 一、摘要二、PCA的降维思路三、PCA代码实现降维过程3.1 PCA类的实现与封装3.2 PCA类的使用示例 四、PCA的恢复过程 一、摘要 本文详细介绍了主成分分析法(PCA)在高维数据降维中的应用。首先,阐述了PCA的基…...
LangChain开发(七)自定义输出格式(JSON/XML/YAML)
文章目录 JSON结构输出未使用PydanticPydantic流式处理 XML结构输出xml输出指定字段 YAML输出源码地址参考资料 JSON结构输出 虽然一些模型提供商支持内置的方法返回结构化输出,但并非所有都支持。我们可以使用输出解析器来帮助用户通过指示指定任意的JSON模型&…...
RustDesk部署到linux(自建服务器)
简介 RustDesk是一款开源的远程桌面软件,由中国开发者开发,使用Rust编程语言构建。它支持跨平台运行,可以在Windows、macOS、Linux、iOS、Android和Web等多个平台上使用。RustDesk的主要功能包括远程桌面访问、文件传输、文本聊天等&…...
分布式锁,redisson,redis
目录 什么是分布式锁分布式锁解决什么问题分布式锁的特点使用分布式锁的场景怎么使用分布式锁1. 添加依赖2. 配置 Redisson 客户端3. 使用 Redisson 实现分布式锁 什么是分布式锁 分布式锁是一种锁机制,用于在分布式环境下,解决多个线程并发访问同一共享…...
linux常用指令(9)
加油同志们,我们离胜利不远了,再有两天我们就可以了解完linux的一些基本常用指令了,到时我们便可以进入一些shell脚本语法了,那么话不多说,来看. 1.more指令 功能描述:more指令是一个基于vi编辑器的文本过滤器,它以全屏幕的方式按页显示文本文件的内容. 基本语法…...
深入解析 JVM 内存区域及核心概念
深入解析 JVM 内存区域及核心概念 Java 虚拟机(JVM)内部划分了多个内存区域,每个区域存储不同类型的数据并承担不同的职责。本文将详细介绍以下内容: 程序计数器:记录当前线程正在执行的字节码指令及其“行号”信息&a…...
字节跳动春招研发部笔试题解
字节跳动春招研发部笔试题 1.万万没想到之聪明的编辑 我叫王大锤,是一家出版社的编辑。我负责校对投稿来的英文稿件,这份工作非常烦人,因为每天都要去修正无数的拼写错误。但是,优秀的人总能在平凡的工作中发现真理。我发现一个发…...
java对象模型
java对象自身的存储模型JVM会给这个类创建一个instanceKlass,保存在方法区,用来在JVM层表示该Java类。 a类。当我们在Java代码中,使用new创建一个对象的时候,JVM会在栈中给对象赋值,会在堆中创建一个instanceOopDesc对…...
深入理解指针(3)(C语言版)
文章目录 前言 一、字符指针变量二、数组指针变量2.1 数组指针变量是什么2.2 数组指针变量怎么初始化2.2.1 静态初始化2.2.2 动态初始化 三、二维数组传参的本质四、函数指针变量4.1 函数指针变量的创建4.2 函数指针变量的使用4.3 typedef关键字4.4拓展 五、函数指针数组六、转…...
Linux内核 内存管理 物理内存初始化流程
1.ARM64页表初始化流程图 start_kernel()│▼ setup_arch() // 架构相关初始化│▼ early_fixmap_init() // 初始化Fixmap(临时映射设备树等)│▼ arm64_memblock_init() // 从设备树解析内存布局│▼ arm…...
Day23:和为s的数字
购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。 示例 1: 输入:price [3, 9, 12, 15], target 18 输出:[3,15] 或者 [15,3]示例 2&#x…...
Transformer 通关秘籍2:利用 BERT 将文本 token 化
前面两节分别通过两个代码示例展示了模型将文本转换为 token 之后是什么样的,希望你可以对此有一个感性的认识。 本节来简要介绍一下将一个连续的文本转换为 token 序列的大致过程,这个过程被称为分词,也叫 tokenization。 在你没了解这方面…...
电脑干货:万能驱动--EasyDrv8
目录 万能驱动EasyDrv8 功能介绍 主程序界面 驱动解压与安装 PE环境支持 系统部署环境 桌面环境一键解决方案 万能驱动8电脑版是由IT天空出品的一款智能识别电脑硬件并自动安装驱动的工具,一般又称为it天空万能驱动,万能驱动vip版,简称…...
18502 字符串哈希匹配字符串
18502 字符串哈希匹配字符串 ⭐️难度:中等 🌟考点:字符串hash 📖 📚 import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.Scanner;public class Main {static int…...
openmmlab介绍 一下
OpenMMLab 是由商汤科技(SenseTime)发起并维护的开源深度学习项目,专注于计算机视觉领域。它提供了一系列模块化、可扩展的工具库,旨在帮助研究者和开发者高效地实现、复现和部署前沿的视觉算法。OpenMMLab 的设计强调模块化、…...
基于javaweb的SpringBoot线上网络文件管理系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…...
【设计模式】工厂模式详解-----简单工厂模式、工厂方法模式、抽象工厂模式
工厂模式详解 一、概述 工厂模式(Factory Pattern) 是一种 创建型设计模式,用于 封装对象的创建逻辑,避免在代码中直接实例化对象,从而提高代码的 可维护性、扩展性和解耦性。 二、工厂模式分类 工厂模式包括 简单工…...
【雅思播客09】Turn Left here.
Hello everyone! And welcome to my channel! Im Reevs. Good morning! 大家好,欢迎来到懒人英语晨读栏目,我是Reevs,早上好呀。 I have a great lesson for you today. 今天我有一堂非常棒的课。 We have an elementary lesson, which is …...
初阶7 vector
本章重点 vector的介绍vector的使用vector的模拟实现 1.vector的介绍 vector就类似数据结构中的顺序表 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。 意味着可以采用下标对vector的元素 进行访问,和数…...
归并排序总结
归并排序是分治法的典型应用,把两个或k个有序的子序列合并为一个。2路归并,2合一。k路归并,k合一。内部排序通常采用2路归并排序,先将数组分成两半,分别排序,然后合并。合并的过程需要将两个有序的子数组合…...
ollama迁移已下载的单个模型到服务器
ollama迁移已下载的单个模型到服务器 场景 ollama是面向用户级的,部署和运行都很简单,是否高效就另说了。但最起码,他能充分利用用户的硬件设备,在GPU不足也能调用cpu和内存去加持。 ollama运行的模型基本是量化版本的…...
基于SSM+Vue物流信息管理系统(附源码)
预览页面 获取方式 https://gitee.com/XiaoLin_Java/communion/blob/master/README.en.md...
docker创建registry镜像仓库2.8版本
目录 shell脚本内容 运行效果 问题与解决 涉及镜像包registry:2.8(x86版本) shell脚本内容 [roottest1 docker]# cat registry.sh #!/bin/bash read -p "请输入用户:" user read -p "请输入密码:" passpathpwd passdir"$…...
Ubuntu下用QEMU模拟运行OpenBMC
1、前言 在调试过程中,安装了很多依赖库,具体没有记录。关于kvm,也没理清具体有什么作用。本文仅记录,用QEMU成功的将OpenBMC跑起来的过程,做备忘,也供大家参考。 2、环境信息 VMware Workstation 15 Pro…...
Unity Shader编程】之复杂光照
在Unity Shader的LightMode标签中,除了前向渲染和延迟渲染外,还支持多种渲染模式设置。以下是主要分类及用途: 一、核心渲染路径模式 前向渲染相关 ForwardBase 用于基础光照计算,处理环境光、主平行光、逐顶点/SH光源及光照贴图。…...
从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.1.3前馈网络(FFN)与激活函数(GELU)优化
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 2.1.3 前馈网络(FFN)与激活函数(GELU)优化1. 前馈网络(FFN)的架构设计与数学原理1.1 FFN在Transformer中的核心作用2. GELU激活函数的数学特性与优化2.1 GELU的数学形式与近似计算3. 逐行代码实现…...
STM32 MODBUS-RTU主从站库移植
代码地址 STM32MODBUSRTU: stm32上的modbus工程 从站 FreeModbus是一个开源的Modbus通信协议栈实现。它允许开发者在各种平台上轻松地实现Modbus通信功能,包括串口和以太网。FreeMODBUS提供了用于从设备和主站通信的功能,支持Modbus RTU和Modbus TCP协…...
计算机是如何工作的
目录 冯诺依曼体系 CPU基本工作流程: 逻辑门 门电路 算术逻辑单元 ALU(Arithmetic&LogicUnit) 算术单元(Arithmetic Unit) 逻辑单元(Logic Unit) ALU符号 寄存器(Register)和内存(RAM) 控制单元 CU(Control Unit) 指令(Instruc…...
Arduino、ESP32驱动GUVA-S12SD UV紫外线传感器(光照传感器篇)
目录 1、传感器特性 2、控制器和传感器连线图 3、驱动程序 UV紫外线传感器是一个测试紫外线总量的最佳传感器,它不需要使用波长滤波器,只对紫外线敏感。 Arduino UV紫外线传感器,直接输出对应紫外线指数(UV INDEX)的线性电压,输出电压范围大约0~1100mV(对应UV INDEX值…...
【NLP 48、大语言模型的神秘力量 —— ICL:in context learning】
目录 一、ICL的优势 1.传统做法 2.ICL做法 二、ICL的发展 三、ICL成因的两种看法 1.meta learning 2.Bayesian Inference 四、ICL要点 ① 语言模型的规模 ② 提示词prompt中提供的examples数量和顺序 ③ 提示词prompt的形式(format) 五、fine-tune VS I…...
面向对象软件工程实践软件案例
智力运动-数字化思维训练课程介绍 数字化思维训练是科技赋能素质教育创新实践项目,通过数字化信息化手段,深度融合优质原创智力运动教育课程资源,服务幼儿园与小学,提供信息时代校园素质教育教学解决方案。在《面向对象软件工程》…...
PX4飞控-接收MAVLINK消息(2)-生成MAVLINK_MSG_ID_***.h文件
我在自制的底板上跑vxworks操作系统中移植了MAVLINK的C库用来与PX4飞控进行通信,其中使用的C库和其他依赖文件,例如common文件夹均为从飞控源码中获取,文件获取位置为px4-Autopolite/bulid/mavlink中,因为PX4源码中自带MAVLINK的依…...
Spring Boot 连接 MySQL 配置参数详解
Spring Boot 连接 MySQL 配置参数详解 前言参数及含义常用参数及讲解和示例useUnicode 参数说明: 完整配置示例注意事项 前言 在 Spring Boot 中使用 Druid 连接池配置 MySQL 数据库连接时,URL 中 ? 后面的参数用于指定连接的各种属性。以下是常见参数…...
【数据结构】_单链表_相关面试题(二)
本章重点 hello友友们~ 今天我们将对单链表的后半部分的相关面试题进行详细解析,下面就跟着我一起开启吧~ really GO! 1.相交链表 题目: 输入两个链表,找出它们的第一个公共结点。 代码分析: //找到相交结点…...
深入理解指针(2)(C语言版)
文章目录 前言一、数组名的理解二、使用指针访问数组三、一维数组传参的本质四、冒泡排序五、二级指针六、指针数组七、指针数组模拟二维数组总结 前言 在上一篇文章中,我们初步了解了指针的基本概念和用法。今天,我们将继续深入探索指针在数组、函数传…...
二叉树相关算法实现:判断子树与单值二叉树
目录 一、判断一棵树是否为另一棵树的子树 (一)核心思路 (二)代码实现 (三)注意要点 二、判断一棵树是否为单值二叉树 (一)核心思路 (二)代码实现…...
redux ,react-redux,redux-toolkit 简单总结
Redux、React-Redux 和 Redux Toolkit 是协同工作的三个库,各自承担不同角色,相互协同。 Redux:基础底座 底层状态管理库,负责状态存储、Action 派发和 Reducer 执行 React-Redux:连接 React 组件与 Redux Store 通…...