【react】常见的性能优化 1
目录
常见的 React 性能优化手段
1. 使用 useMemo 和 useCallback 缓存数据和函数
2. 使用 React.memo 缓存组件
3. 组件懒加载
4. 合理使用 key
5. 在组件销毁时清除定时器/事件
6. 使用 Suspense 和 Lazy 拆分组件
7. 使用 Fragment 避免额外标记
8. 避免使用内联函数
9. 避免使用内联样式
10. 优化渲染条件
11. 为组件创建错误边界
12. 组件卸载前进行清理操作
13. 使用 PureComponent
14. 使用 shouldComponentUpdate
15. 在构造函数中进行函数 this 绑定
16. 类组件中的箭头函数
17. 避免数据结构突变
18. 依赖优化
常见的 React 性能优化手段
在开发 React 应用时,性能优化是确保应用高效运行的关键。以下是常见的 React 性能优化手段,并附带代码示例和解释。
1. 使用 useMemo
和 useCallback
缓存数据和函数
useMemo
和 useCallback
是 React 提供的 Hooks,用于缓存计算结果和函数引用,避免不必要的重新渲染。
示例:
import React, { useState, useMemo, useCallback } from 'react';const data = {userName: '张三',age: 19,fav: '篮球、排球',
};const getUserInfo = () => {return {...data,random: Math.random(),};
};function Case2() {const [count, setCount] = useState(0);// 使用 useMemo 缓存数据const userInfo = useMemo(() => getUserInfo(), []);// 使用 useCallback 缓存函数const handleClick = useCallback(() => {setCount(count + 1);}, [count]);return (<div><div>姓名:{userInfo.userName}</div><div>年龄:{userInfo.age}</div><div>爱好:{userInfo.fav}</div><div>随机数: {userInfo.random}</div><div>当前页面渲染次数: {count}</div><button onClick={handleClick}>刷新渲染组件</button></div>);
}
解释:
useMemo
确保getUserInfo
的结果只在首次渲染时计算一次。
useCallback
确保handleClick
函数的引用不会在每次渲染时都重新创建。
2. 使用 React.memo
缓存组件
React.memo
类似于 shouldComponentUpdate
,当 props 没有变化时,不会重新渲染组件,从而提高性能。
示例:
import React from 'react';
import { Button } from 'antd';const BasicButton = (props) => {return <Button {...props}></Button>;
};export default React.memo(BasicButton, (oldProps, newProps) => {return oldProps === newProps; // true - 不更新 false - 更新
});
解释:
React.memo
接收一个比较函数,只有当 props 发生变化时才会重新渲染组件。
3. 组件懒加载
使用组件懒加载可以减少初始 bundle 文件大小,加快组件加载速度。
示例:
import React, { lazy, Suspense } from 'react';
import { BrowserRouter, Link, Route, Switch } from 'react-router-dom';const Home = lazy(() => import(/* webpackChunkName: "Home" */ './Home'));
const List = lazy(() => import(/* webpackChunkName: "List" */ './List'));function App() {return (<BrowserRouter><Link to="/">Home</Link><Link to="/list">List</Link><Switch><Suspense fallback={<div>Loading</div>}><Route path="/" component={Home} exact /><Route path="/list" component={List} /></Suspense></Switch></BrowserRouter>);
}export default App;
解释:
lazy
动态导入组件,Suspense
提供加载状态。
4. 合理使用 key
在 map
循环中尽量使用唯一的标识作为 key
,避免使用 index
作为 key
,方便复用组件。
示例:
import React from 'react';const list = [{ id: 1, name: '张三' },{ id: 2, name: '李四' },{ id: 3, name: '王五' },
];function Case3() {return (<div>{list.map((item) => (<div key={item.id}>{item.name}</div>))}</div>);
}export default Case3;
解释:使用
id
作为key
,确保每个元素的唯一性。
5. 在组件销毁时清除定时器/事件
组件卸载时清除相关事件、定时器,防止内存泄漏。
示例:
import React, { useEffect, useState } from 'react';function Case1() {const [count, setCount] = useState(0);useEffect(() => {const timer = setInterval(() => {setCount(count + 1);}, 1000);return () => {clearInterval(timer);};}, [count]);return <div>{count}</div>;
}export default Case1;
解释:
useEffect
返回的清理函数会在组件卸载时执行,清除定时器。
6. 使用 Suspense
和 Lazy
拆分组件
通过 Suspense
和 Lazy
实现按需加载组件,提升首屏加载速度。
示例:
import React, { lazy } from 'react';
import ReactDOM from 'react-dom/client';
import { createBrowserRouter, RouterProvider } from 'react-router-dom';const LearnReactOptimize = lazy(() => import('./pages/LearnReactOptimize'));const LazyBoundary = (WrapComp) => (<Suspense fallback={<div>loading....</div>}><WrapComp /></Suspense>
);const routeConfig = createBrowserRouter([{path: '/LearnReactOptimize',element: LazyBoundary(LearnReactOptimize),},{path: '/',element: <App />,},
]);const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<React.StrictMode><RouterProvider router={routeConfig} /></React.StrictMode>,
);
解释:
Suspense
提供加载状态,Lazy
动态导入组件。
7. 使用 Fragment
避免额外标记
通过 Fragment
减少不必要的标签,简化 DOM 结构。
示例:
import React from 'react';// bad
function AppBad() {return (<div><div>1</div><div>2</div></div>);
}// good
function AppGood() {return (<><div>1</div><div>2</div></>);
}
解释:
Fragment
(<>...</>
) 不会生成额外的 DOM 元素。
8. 避免使用内联函数
避免在 JSX 中使用内联函数,以减少不必要的函数创建。
示例:
import React from 'react';// bad
function AppBad() {const handleClick = () => {console.log('click');};return <div onClick={() => handleClick()}>App</div>;
}// good
function AppGood() {const handleClick = () => {console.log('click');};return <div onClick={handleClick}>App</div>;
}
解释:内联函数每次渲染都会创建新的函数实例,导致不必要的性能开销。
9. 避免使用内联样式
避免使用内联样式,将样式提取到 CSS 文件中,减少 JavaScript 执行时间。
示例:
import React from 'react';
import './App.css'; // 引入外部 CSS 文件function App() {return <div className="app-style">App works</div>;
}export default App;
解释:将样式提取到外部 CSS 文件中,减少 JavaScript 执行时间。
10. 优化渲染条件
避免不必要的渲染,确保组件只在必要时更新。
示例:
import React, { useState, useEffect } from 'react';function App() {const [count, setCount] = useState(0);const [name] = useState("张三");useEffect(() => {setInterval(() => {setCount(prev => prev + 1);}, 1000);}, []);return (<div>{count}<ShowNameMemo name={name} /></div>);
}function ShowName({ name }) {console.log("showName render...");return <div>{name}</div>;
}const ShowNameMemo = React.memo(ShowName);export default App;
解释:使用
React.memo
防止不必要的重新渲染。
11. 为组件创建错误边界
捕获子组件中的错误,防止整个组件树崩溃。
示例:
import React from 'react';class ErrorBoundary extends React.Component {constructor(props) {super(props);this.state = { hasError: false };}static getDerivedStateFromError(error) {return { hasError: true };}componentDidCatch(error, errorInfo) {console.log(error, errorInfo);}render() {if (this.state.hasError) {return <h1>Something went wrong.</h1>;}return this.props.children;}
}export default ErrorBoundary;
解释:
ErrorBoundary
捕获子组件中的错误,显示降级 UI。
12. 组件卸载前进行清理操作
确保组件卸载时清理定时器、事件监听等资源。
示例:
import React, { useState, useEffect } from 'react';
import ReactDOM from 'react-dom';const App = () => {const [count, setCount] = useState(0);useEffect(() => {let timer = setInterval(() => {setCount(prev => prev + 1);}, 1000);return () => {clearInterval(timer);};}, []);return (<button onClick={() => ReactDOM.unmountComponentAtNode(document.getElementById('root'))}>{count}</button>);
};export default App;
解释:
useEffect
返回的清理函数会在组件卸载时执行,清除定时器。
13. 使用 PureComponent
PureComponent
是类组件的优化版本,自动实现浅比较,减少不必要的渲染。
示例:
import React from 'react';class App extends React.Component {constructor(props) {super(props);this.state = {count: 1,};}componentDidMount() {this.setState({ count: 1 });}render() {return (<div><RegularChildComponent count={this.state.count} /><PureChildComponent count={this.state.count} /></div>);}
}class RegularChildComponent extends React.Component {render() {console.log('RegularChildComponent render');return <div>{this.props.count}</div>;}
}class PureChildComponent extends React.PureComponent {render() {console.log('PureChildComponent render');return <div>{this.props.count}</div>;}
}export default App;
解释:
PureComponent
自动实现浅比较,减少不必要的渲染。
14. 使用 shouldComponentUpdate
手动控制组件是否需要更新。
示例:
import React from 'react';export default class App extends React.Component {constructor() {super();this.state = { name: '张三', age: 20, job: 'waiter' };}componentDidMount() {setTimeout(() => this.setState({ job: 'chef' }), 1000);}shouldComponentUpdate(nextProps, nextState) {if (this.state.name !== nextState.name || this.state.age !== nextState.age) {return true;}return false;}render() {console.log('rendering');let { name, age } = this.state;return <div>{name} {age}</div>;}
}
解释:
shouldComponentUpdate
控制组件是否需要更新。
15. 在构造函数中进行函数 this
绑定
确保类方法中的 this
指向正确。
示例:
import React from 'react';export default class App extends React.Component {constructor() {super();this.handleClick = this.handleClick.bind(this);}handleClick() {console.log(this);}render() {return <button onClick={this.handleClick}>按钮</button>;}
}
解释:构造函数中绑定
this
,确保方法中的this
指向正确。
16. 类组件中的箭头函数
使用箭头函数避免 this
绑定问题。
示例:
import React from 'react';export default class App extends React.Component {handleClick = () => console.log(this);render() {return <button onClick={this.handleClick}>按钮</button>;}
}
解释:箭头函数自动绑定
this
,避免手动绑定。
17. 避免数据结构突变
保持组件中 props
和 state
的数据结构一致,避免突变。
示例:
import React, { Component } from 'react';export default class App extends Component {constructor() {super();this.state = {employee: {name: '张三',age: 20,},};}render() {const { name, age } = this.state.employee;return (<div>{name}{age}<buttononClick={() =>this.setState({...this.state,employee: {...this.state.employee,age: 30,},})}>change age</button></div>);}
}
解释:使用扩展运算符避免直接修改对象。
18. 依赖优化
优化第三方库的引入,减少打包体积。
示例:
-
安装依赖:
yarn add react-app-rewired customize-cra lodash babel-plugin-lodash
-
创建
config-overrides.js
:const { override, useBabelRc } = require('customize-cra');module.exports = override(useBabelRc());
-
修改
package.json
:"scripts": {"start": "react-app-rewired start","build": "react-app-rewired build","test": "react-app-rewired test --env=jsdom","eject": "react-scripts eject" }
-
创建
.babelrc
:{"plugins": ["lodash"] }
-
使用 Lodash:
import React from 'react'; import _ from 'lodash';function App() {console.log(_.chunk(['a', 'b', 'c', 'd'], 2));return <div>App works</div>; }export default App;
解释:使用
react-app-rewired
和customize-cra
覆盖默认配置,babel-plugin-lodash
优化 Lodash 的引入。
码字不易,大佬们点点赞
相关文章:
【react】常见的性能优化 1
目录 常见的 React 性能优化手段 1. 使用 useMemo 和 useCallback 缓存数据和函数 2. 使用 React.memo 缓存组件 3. 组件懒加载 4. 合理使用 key 5. 在组件销毁时清除定时器/事件 6. 使用 Suspense 和 Lazy 拆分组件 7. 使用 Fragment 避免额外标记 8. 避免使用内联函…...
SpringCloud源码-openFeign
LoadBalancer默认只有nacos服务发现器 openFeign与springcloud loadbalancer的结合点...
QLabel添加点击处理
在QLabel中添加点击事件有三种方式,分别是 使用LinkActivated信号连接槽函数(有缺限)注册事件分发器eventFilter创建类重写鼠标事件 1. 使用LinkActivated信号 QLabel类中有LinkActivated信号,是当标签中的链接被点击的时候触发…...
Markdown表格的使用
Markdown表格的使用 前言语法详解定义表格设定表格列内容的对齐方式 使用场景及实例小结其他文章快来试试吧 Markdown表格的使用👈点击这里也可查看 前言 表格通常作为一种布局的形式,用于结构化的数据展示。 Markdown表格包含三个部分:表头…...
时间序列预测算法介绍
时间序列预测是根据时间序列数据的历史变化规律,对未来数据进行预测的方法。在给定的代码中,使用的是自回归(AR)模型中的AR(4)模型来预测光伏功率。以下将详细解释这种算法: 1. 自回归模型(AR模型…...
加密流量TLS1.2 和TLS1.3的握手区别
加密流量TLS1.2 和TLS1.3的握手区别 TLS1.2 握手均是明文 1)Client Hello 2)Server Hello 3)Certificate TLS1.3 握手中Client Hello是明文,而Server Hello中Extensions以及后面的握手信息不可见 1)Client Hello…...
MySQL数据库——主从复制
本文详细介绍 MySQL的主从复制,从原理到配置再到同步过程。 文章目录 简介核心组件主从复制的原理作用主从复制的线程模型主从复制的模式形式复制的方式设计复制机制主从复制的配置步骤优化和改进总结 简介 MySQL 主从复制(Replication)是一…...
详细说明嵌入式linux中bootcmd与bootargs差异
bootcmd 和 bootargs 是在嵌入式系统开发,特别是基于U-Boot(一个广泛应用的开源引导加载程序)环境中常见的两个重要参数,它们的区别如下: 功能用途 bootcmd: 定义:bootcmd 是U-Boot中的一个环…...
【UE5】UnrealEngine源码构建2:windows构建unreal engine 5.3.2
参考大神知乎的文章:UE5 小白也能看懂的源码编译指南 据说会耗费400G的空间。 代码本身并不大,可能是依赖特别多,毕竟看起来UE啥都能干,核心还是c++的, 【UE5】UnrealEngine源码构建1:tag为5.3.2源码clone 本着好奇+ 学习的态度,想着也许有机会能更为深入的熟悉UE的机制…...
【YOLO算法改进】ALSS-YOLO:无人机热红外图像|野生动物小目标检测
目录 论文信息 论文创新点 1.自适应轻量通道分割和洗牌(ALSS)模块 2.轻量坐标注意力(LCA)模块 3.单通道聚焦模块 4.FineSIOU损失函数 摘要 架构设计 轻量高效网络架构 - ALSS模块 LCA模块 单通道聚焦模块 损失函数优…...
时间序列预测算法---LSTM
文章目录 一、前言1.1、深度学习时间序列一般是几维数据?每个维度的名字是什么?通常代表什么含义?1.2、为什么机器学习/深度学习算法无法处理时间序列数据?1.3、RNN(循环神经网络)处理时间序列数据的思路?1.4、RNN存在哪些问题?…...
【QT】:QT图形化界面概述
Qt背景介绍 1.1 什么是Qt Qt 是⼀个跨平台的C图形⽤⼾界⾯应⽤程序框架。它为应⽤程序开发者提供了建⽴艺术级图形 界⾯所需的所有功能。它是完全⾯向对象的,很容易扩展。Qt为开发者提供了⼀种基于组件的开发模 式,开发者可以通过简单的拖拽和组合来实现…...
[论文笔记]Representation Learning with Contrastive Predictive Coding
引言 今天带来论文 Representation Learning with Contrastive Predictive Coding的笔记。 提出了一种通用的无监督学习方法从高维数据中提取有用表示,称为对比预测编码(Contrastive Predictive Coding,CPC)。使用了一种概率对比损失, 通过使用负采样使…...
Redis相关
Redis相关 什么是redis?redis可以干什么? Redis是一个c语言编写的nosql数据库(不仅仅是sql,泛指非关系型数据库,一般把非关系型数据库称为nosql数据库),数据在内存中以键值对的形式存储,读写速度快,提供数据持久化方式. 常常被广泛应用到做缓存 Redis使用场景 1.缓存 2…...
【优选算法】Binary-Blade:二分查找的算法刃(上)
文章目录 1.概念解析2.二分查找的简单模版3.二分查找的进阶模版4.x的平方根5.搜索插入位置希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力! 本篇是优选算法之二分查找算法,该算法是一种高效的在有序数组中查找特定元素的搜索算法 1.概…...
Docker--Docker Network(网络)
Docker Network(网络)是Docker容器之间和容器与外部网络之间的通信和连接的一种机制。以下是对Docker Network的详细解释: 一、Docker网络的重要性 Docker容器网络是为应用程序所创造的虚拟环境的一部分,它能让应用从宿主机操作…...
转化率是衡量网页设计的一个重要指标,请问如何做?
AARRR是互联网产品运营中一个非常重要的模型,这些模型的每一个步骤都涉及到转化率问题,那么AARRR是是什么呢?转化漏斗是什么吗?转化率为什么重要?设计师在做网页设计的时候,如何提升转化率呢?本…...
运维工具之syncthing工具的安装和使用
一、syncthing工具简介 Syncthing是一款开源的文件同步工具,采用Go语言编写。它支持在多个操作系统上运行,包括Windows、macOS和Linux,以及BSD、Solaris和Android等。以下是对这款软件的详细介绍,主要功能: 实时文件同…...
国产数据库-崖山使用介绍
本文档基于崖山数据库23.3 个人版本,单机(主备)部署模式的情况下的使用介绍。 数据库实例状态: NOMOUNT:仅读取参数文件,不加载数据库 MOUNT:读取控制文件,加载数据库ÿ…...
primevue的<Menu>组件
1.使用场景 2.代码 1.给你的menu组件起个引用名 2.<Menu>组件需要一个MenuItem[] 3.你要知道MenuItem[ ]的特殊的数据格式,就像TreeNode[ ]一样,数据格式不对是不渲染的。。。。 常用的属性就这几种,js语言和java不一样,J…...
【玩转23种Java设计模式】行为型模式篇:备忘录模式
软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。 汇总目录链接&…...
便捷饭店点餐小程序的设计与实现ssm+论文源码调试讲解
第4章 系统设计 一个成功设计的系统在内容上必定是丰富的,在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值,吸引更多的访问者访问系统,以及让来访用户可以花费更多时间停留在系统上,则表明该系统设计得比较专…...
微信小程序Uniapp
使用命令行创建项目(vuets) npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project然后用HBX打开项目 再安装依赖 npm i 再运行开发版本,生成dist目录 pnpm dev:mp-weixin 注意要设置APPid 再用微信小程序打开...
Android GameActivity(NativeActivity)读写文件
最近研究native android相关内容,其中最棘手的就是文件读写问题,最主要的是相关的文档很少。这里写下我所知道的方法。 由于本人使用的是Android14[arm64-v8a]版本的设备,能访问的路径相当有限,如果想要访问更多的路径,就不得不申…...
《计算机网络A》单选题-复习题库解析-2
目录 51、下列关于以太网网卡地址特点的说法中,不正确的是( )。 52、当一个Web Browser向一个使用标准服务器端口的Web Server提出请求时,那么在服务返回的响应包中,所使用的源端口是( ࿰…...
GPU 进阶笔记(二):华为昇腾 910B GPU
大家读完觉得有意义记得关注和点赞!!! 1 术语 1.1 与 NVIDIA 术语对应关系1.2 缩写2 产品与机器 2.1 GPU 产品2.2 训练机器 底座 CPU功耗操作系统2.3 性能3 实探:鲲鹏底座 8*910B GPU 主机 3.1 CPU3.2 网卡和网络3.3 GPU 信息 3.3…...
如何利用 ClickHouse 实现高级分析:MySQL 到 ClickHouse 实时数据同步指南
在数据驱动的时代,企业必须依靠先进的数据分析能力来提升竞争力。随着数据量的激增和业务需求的复杂化,传统的关系型数据库已经无法满足高效处理和实时分析的需求。ClickHouse 作为一款高性能的列式数据库,凭借其卓越的查询性能和可扩展性&am…...
Python读取TIF文件
在Python中,逐帧读取TIFF文件(尤其是多页TIFF文件)可以使用tifffile库或Pillow库。以下是两种方法的示例: 方法 1:使用 tifffile 逐帧读取 tifffile 是一个专门用于处理TIFF文件的库,支持多页TIFF文件的逐…...
vue3+ts+element-plus 表单el-form取消回车默认提交
问题描述:在表单el-form中的el-input中按回车后,页面会刷新,url也会改变, 回车前: 回车后: 相关代码: 解决方法1:在 el-form 上阻止默认的 submit 事件,增加 submit.pre…...
面试经典150题——滑动窗口
文章目录 1、长度最小的子数组1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、无重复字符的最长子串2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、串联所有单词的子串3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 4、最小覆盖子串4.1 题目链接4.2 题目描…...
目标检测之DINO详解
相关链接 论文:[2203.03605] DINO: DETR with Improved DeNoising Anchor Boxes for End-to-End Object Detectionhttps://arxiv.org/abs/2203.03605 代码:...
Linux指令
1. 将一个文件夹中的前5000张图片移动到另一个文件夹 可以使用 find 和 mv 命令来实现将一个文件夹 folder1 中的前 5000 张 jpg 图片移动到另一个文件夹 folder2。下面是具体的步骤: 首先,确保 folder2 存在。如果不存在,可以使用 mkdir 命…...
groovy:多线程 简单示例
在Groovy中,多线程编程与Java非常相似,因为Groovy运行在Java虚拟机(JVM)上,并且可以利用Java的所有并发工具。以下是一些在Groovy中实现多线程编程的方法: class MyThread extends Thread {Overridevoid…...
硬件产品:做产品,不仅仅是产品思维
目录 前言 1. 产品思维阶段 2. 流量思维阶段 3. 用户思维阶段 作者简介 前言 从思维层面来看, 做产品会经历三个阶段,分别是: 1. 产品思维阶段; 2. 流量思维阶段; 3. 用户思维阶段。 如果不理解这三个思维…...
【小程序开发】解决 HBuilder X 提示“本项目类型无法运行到小程序模拟器”
今天在hbuilder引入一个项目时,准备将该项目在微信开发者工具上运行时,发现提示“本项目类型”,如何解决这个问题? 问题如下: 第一:检查一下文件夹是否为一级文件夹(如图) 不要有多个…...
RuoYi-Vue从http升级为https(Jar+Nginx)
一、前提条件 1.已通过数字证书管理服务控制台签发证书。 2.SSL证书绑定的域名已完成DNS解析,即域名与主机IP地址相互映射。 附:阿里云网站运维检测平台 3.已在Web服务器开放443端口(HTTPS通信的标准端口)。 如果使用的是阿里云ECS服务器,请确保已经在安全组规则入方向…...
探索 Yocto-Meta-OpenEuler:嵌入式开发的强大基石
title: 探索 Yocto-Meta-OpenEuler:嵌入式开发的强大基石 date: ‘2024-11-19’ category: blog tags: Yocto-Meta-OpenEuler嵌入式系统开源项目定制化开发 sig: EmbeddedTech archives: ‘2024-12’ author:way_back summary: Yocto-Meta-OpenEuler 为嵌入式系统开…...
leetcode 3219. 切蛋糕的最小总开销 II
题目:3219. 切蛋糕的最小总开销 II - 力扣(LeetCode) 排序贪心。 开销越大的越早切。 注意m或n为1的情况。 class Solution { public:long long minimumCost(int m, int n, vector<int>& horizontalCut, vector<int>&…...
UniApp 打开文件工具,获取文件类型,判断文件类型
注意:以下代码使用 typeScript 开发,如果想在 js 中使用,可参考 npm 已经发布的包:https://www.npmjs.com/package/uni-easy-file NPM 使用 如果想直接在 npm 项目中使用可以直接执行以下命令 npm i uni-easy-file然后直接使用 …...
webpack打包node后端项目
webpack打包后端项目 后端项目写好了,感觉也可以打包一下,然后就想到了用webpack试试 先要下载webpack和webpack-cli npm install webpack webpack-cli然后创建webpack配置文件webpack.config.js 核心配置为entry、output、target 但是因为咱们是后…...
《学习之道》
《学习之道》主要讲述了以下内容: 学习的原理 大脑的两种认知模式:介绍了专注模式和发散模式。专注模式适合集中精力解决具体问题、进行深度理解和记忆推理,但长时间使用易疲惫和陷入思维定式;发散模式则让大脑在更广泛的认知网…...
随笔 | 写在2024的最后一天
. 前言 转眼又到了一年的末端。过去这一年,和前些年有些不同,变化巨大,感触良多。多到一时竟不知从何开始写。今天这篇随笔,因为时间有限,可能文法也会有些凌乱,就是想到哪里写到哪里,如果未来…...
对三层架构的梳理(Controller、Service、Dao)
项目结构如下: src├── main│ └── java│ └── com│ └── example│ └── demo│ ├── controller│ │ └── UserController.java│ ├…...
常用的公共 NTP(网络时间协议)服务器
公共 NTP 服务列表 以下是一些常用的公共 NTP(网络时间协议)服务器,供您参考: 中国地区公共 NTP 服务器 国家授时中心 NTP 服务器:ntp.ntsc.ac.cn中国 NTP 快速授时服务:cn.ntp.org.cn阿里云公共 NTP 服务…...
SimForge HSF 案例分享|复杂仿真应用定制——UAVSim无人机仿真APP(技术篇)
导读 「神工坊」核心技术——「SimForge HSF高性能数值模拟引擎」支持工程计算应用的快速开发、自动并行,以及多域耦合、AI求解加速,目前已实现航发整机数值模拟等多个系统级高保真数值模拟应用落地,支持10亿阶、100w核心量级的高效求解。其低…...
ROS2+OpenCV综合应用--10. AprilTag标签码追踪
1. 简介 apriltag标签码追踪是在apriltag标签码识别的基础上,增加了小车摄像头云台运动的功能,摄像头会保持标签码在视觉中间而运动,根据这一特性,从而实现标签码追踪功能。 2. 启动 2.1 程序启动前的准备 本次apriltag标签码使…...
Qanything 2.0源码解析系列6 PDF解析逻辑
Qanything 2.0源码解析系列6: PDF解析逻辑 type: Post status: Published date: 2024/12/04 summary: 深入剖析Qanything是如何拆解PDF的,核心是pdf转markdown category: 技术分享 原文:www.feifeixu.top 😀 前言: 在前面的文章中探究了图片是怎么进行解析的,这篇文章对…...
IDEA修改编译版本
目录 一、序言 二、修改maven配置 1.修改 2.代码 三、pom文件配置 1.修改 2.代码 3.问题 一、序言 有两种方法可以帮助大家解决IDEA每次刷新maven的pom配置时,会发生发行源版本不正常的报错。个人推荐第二种,原因:第二种你刷新maven后…...
Python 向量检索库Faiss使用
Faiss(Facebook AI Similarity Search)是一个由 Facebook AI Research 开发的库,它专门用于高效地搜索和聚类大量向量。Faiss 能够在几毫秒内搜索数亿个向量,这使得它非常适合于实现近似最近邻(ANN)搜索&am…...
LunarVim安装
LunarVim以其丰富的功能和灵活的定制性,迅速在Nvim用户中流行开来。它不仅提供了一套完善的默认配置,还允许用户根据自己的需求进行深度定制。无论是自动补全、内置终端、文件浏览器,还是模糊查找、LSP支持、代码检测、格式化和调试ÿ…...