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

React 性能优化:从 3 秒卡顿到 60 帧流畅,我做了这 5 件事

摘要React 应用越做越大卡顿问题越来越严重本文分享 5 个亲测有效的性能优化方案包括React.memo正确使用姿势、useMemo依赖陷阱、虚拟列表实战、代码分割策略和 Profiler 调试技巧。每个方案都附带真实代码对比帮你把页面渲染时间从 3 秒降到 300 毫秒。一、开篇引入上周接手了一个老项目打开页面要等 3 秒滚动列表卡成 PPT。用户反馈说这破应用能不能修修产品找我聊了三次。我 profiling 了一下好家伙1200 个组件同时渲染每次状态更新都是全家桶重绘。开发说React 本来就这样没办法。说实话React 背不了这个锅。花了两天时间优化首屏加载从 3 秒降到 800 毫秒列表滚动稳定 60 帧。用户反馈从破应用变成了丝滑。今天把这 5 个核心优化方案分享给你都是踩过坑后总结的实战经验。二、核心解析React 渲染性能的本质为什么 React 会卡React 的渲染机制其实很简单状态变化 → 虚拟 DOM 对比 → 真实 DOM 更新。问题就出在对比这个环节。默认情况下父组件更新所有子组件都会重新渲染。哪怕子组件的 props 根本没变。三、核心优化思路性能优化的本质就一句话减少不必要的渲染。具体拆解成三个维度组件层面避免重复渲染React.memo、PureComponent数据层面避免重复计算useMemo、useCallback加载层面按需加载别一次性全塞进来lazy、Suspense、虚拟列表关键认知优化不是一上来就加memo而是先 profiling 找到瓶颈。我见过太多人盲目加memo结果性能没提升代码可读性先崩了。四、性能指标参考在动手之前先明确目标FCP首次内容绘制 1.5 秒TTI可交互时间 3 秒FPS帧率滚动时稳定 55-60 帧组件渲染时间单个组件 16 毫秒1 帧用 React DevTools 的 Profiler 就能看到这些数据。别凭感觉优化用数据说话。五、实战代码5 个优化方案直接上方案 1React.memo 的正确打开方式先看看错误示范// ❌ 错误每次父组件更新子组件都会重绘 function ProductList({ products }) { return ( div {products.map(p ( ProductCard key{p.id} product{p} / ))} /div ); } function ProductCard({ product }) { console.log(ProductCard rendered); return div{product.name}/div; }每次ProductList更新所有ProductCard都会重绘哪怕product没变。正确做法// ✅ 正确使用 React.memo 包裹 const ProductCard React.memo(({ product }) { console.log(ProductCard rendered); returndiv{product.name}/div; }); // 进阶自定义比较函数 const ProductCard React.memo(({ product, onFavorite }) { returndiv{product.name}/div; }, (prev, next) { // 只有 product 变化才重绘onFavorite 忽略 return prev.product next.product; });亲测效果200 个商品卡片滚动时从每次重绘 200 次降到 0 次数据不变时。方案 2useMemo 依赖数组的坑这个坑我踩过三次每次都要加班 debug。// ❌ 错误依赖对象引用每次都是新对象 function Cart({ items }) { const config { currency: CNY, tax: 0.1 }; const total useMemo(() { return items.reduce((sum, item) { return sum item.price * (1 config.tax); }, 0); }, [items, config]); // config 每次都是新引用 returndivTotal: {total}/div; }结果config每次渲染都是新对象useMemo永远失效计算每次都执行。修复方案// ✅ 正确依赖原始值或稳定引用 function Cart({ items }) { const total useMemo(() { const tax 0.1; // 直接内联 return items.reduce((sum, item) { return sum item.price * (1 tax); }, 0); }, [items]); returndivTotal: {total}/div; } // 或者用 useRef 保持引用稳定 function Cart({ items }) { const configRef useRef({ currency: CNY, tax: 0.1 }); const total useMemo(() { const config configRef.current; return items.reduce((sum, item) { return sum item.price * (1 config.tax); }, 0); }, [items]); returndivTotal: {total}/div; }方案 3长列表必须用虚拟滚动超过 100 条数据的列表别犹豫直接上虚拟列表。// ❌ 错误渲染 1000 个 DOM 节点 function MessageList({ messages }) { return ( div {messages.map(m ( MessageItem key{m.id} message{m} / ))} /div ); }1000 个组件每个渲染 5 毫秒总共 5 秒。这能不卡吗正确做法使用react-window// ✅ 正确只渲染可见区域约 10-20 个 import { FixedSizeList } from react-window; function MessageList({ messages }) { return ( FixedSizeList height{600} itemCount{messages.length} itemSize{60} itemData{messages} {({ index, style, data }) ( MessageItem style{style} message{data[index]} / )} /FixedSizeList ); }效果对比方案渲染节点数滚动 FPS内存占用全量渲染100015-2045MB虚拟列表15608MB方案 4代码分割 懒加载别把整个应用打包成一个 5MB 的 bundle。// ❌ 错误所有路由组件打包在一起 import Home from ./Home; import Dashboard from ./Dashboard; import Settings from ./Settings; function App() { return ( Routes Route path/ element{Home /} / Route path/dashboard element{Dashboard /} / Route path/settings element{Settings /} / /Routes ); }正确做法// ✅ 正确按需加载 import { lazy, Suspense } fromreact; const Home lazy(() import(./Home)); const Dashboard lazy(() import(./Dashboard)); const Settings lazy(() import(./Settings)); function App() { return ( Suspense fallback{Loading /} Routes Route path/ element{Home /} / Route path/dashboard element{Dashboard /} / Route path/settings element{Settings /} / /Routes /Suspense ); }打包体积对比优化前5.2MB首屏加载 3.1 秒优化后1.8MB 首包 按需加载首屏 800 毫秒方案 5用 Profiler 找到真正的瓶颈别猜用工具。// 在开发环境下使用 Profiler import { Profiler } fromreact; function onRenderCallback( id, phase, actualDuration, baseDuration, startTime, commitTime ) { console.log(${id} 渲染耗时${actualDuration}ms); // 超过 16ms 的组件需要优化 if (actualDuration 16) { console.warn(${id} 渲染超时); } } function App() { return ( Profiler idApp onRender{onRenderCallback} Home / /Profiler ); }调试技巧打开 React DevTools → Profiler点击开始录制操作页面点击、滚动等查看哪个组件渲染时间最长针对性优化我一般优先优化渲染时间 50ms 的组件收益最明显。六、选型建议不同场景用什么方案小型项目 20 个组件优先优化图片和网络请求适当使用React.memo不需要虚拟列表和代码分割中型项目20-100 个组件必须用React.memo包裹纯展示组件复杂计算用useMemo/useCallback列表超过 50 条考虑虚拟滚动路由级别代码分割大型项目100 组件全量使用上述方案引入React.lazySuspense考虑服务端渲染SSR建立性能监控体系决策清单□ 列表数据 100 条 → 虚拟列表 □ 组件渲染频繁但 props 不变 → React.memo □ 复杂计算重复执行 → useMemo □ 首屏加载 2 秒 → 代码分割 □ 不确定瓶颈在哪 → Profiler profiling七、踩坑经验这些误区我替你踩过了误区 1到处加 memo见过有人给每个组件都加React.memo结果性能没提升代码难读一倍。真相memo本身有开销浅比较 props。只有当组件渲染频繁且 props 稳定时才有收益。建议先 profiling再优化。别盲目加。误区 2useMemo 依赖写空数组// ❌ 错误依赖空数组永远不更新 const data useMemo(() fetchData(), []);如果fetchData依赖外部变量这样写会导致数据不更新。建议依赖写全或者用useRef保持引用。误区 3忽略渲染外的性能问题性能不只是渲染。我见过一个项目渲染优化得很好但每个接口都返回 10MB 数据。建议同时关注网络请求压缩、缓存、合并图片加载懒加载、WebP 格式JavaScript 执行时间Web Worker 处理重计算调试技巧Chrome Performance 面板看整体时间线React DevTools Profiler看组件渲染详情Lighthouse看综合性能评分自监控关键指标上报到监控平台八、结尾性能优化没有银弹核心就三点减少渲染、减少计算、按需加载。但这 5 个方案能解决 90% 的 React 性能问题。亲测有效。最后送一句我导师的话**优化是为了用户体验不是为了炫技。**别为了优化而优化先 profiling再动手。互动时间你在 React 性能优化上踩过哪些坑评论区聊聊我挑 3 个问题下期详细解答。觉得有用点个赞 在看让更多开发者看到。

相关文章:

React 性能优化:从 3 秒卡顿到 60 帧流畅,我做了这 5 件事

摘要 React 应用越做越大,卡顿问题越来越严重?本文分享 5 个亲测有效的性能优化方案,包括 React.memo 正确使用姿势、useMemo 依赖陷阱、虚拟列表实战、代码分割策略和 Profiler 调试技巧。每个方案都附带真实代码对比,帮你把页面…...

黄仁勋放话:AI基建要烧掉4万亿美元 谁买单?

最近,英伟达掌门人黄仁勋抛出了一句让人瞠目结舌的预测——未来几年,全球在人工智能基础设施上的投入,可能达到4万亿美元。这个数字不是小数目,它相当于某些国家一年的国内生产总值总和。这笔账怎么算的?黄仁勋在达沃斯…...

【应用实战】基于Dify与多Agent的凭证与档案管理

一、智能文档处理:基于Dify与多Agent的凭证与档案管理革新 在金融行业,文档处理贯穿业务始终。传统的纯人工方式不仅耗时费力,而且极易出错。智能文档处理(Intelligent Document Processing, IDP)融合了OCR、自然语言处…...

JWT令牌安全实践详解

JWT令牌安全实践详解 一、JWT概述 JSON Web Token(JWT)是一种用于安全传输信息的开放标准(RFC 7519)。 1.1 JWT结构 ┌───────────────────────────────────────────────────…...

API接口签名验证实战

API接口签名验证实战 一、接口签名概述 API签名验证是保护接口安全的重要手段,防止请求被篡改或伪造。 1.1 签名机制原理 ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 客…...

API安全设计与防护实战

API安全设计与防护实战 一、API安全概述 API作为系统间交互的接口,是攻击的主要目标。一个安全的API设计需要考虑多个层面的防护,包括认证、授权、数据保护、攻击防护等。 二、API认证机制 2.1 API Key认证 Component public class ApiKeyFilter ex…...

AI知识管理不是工具升级,而是教学主权重构:一位特级教师用18个月完成“教案→知识流→认知干预”三级跃迁(全程数据脱敏实录)

更多请点击: https://intelliparadigm.com 第一章:AI知识管理在教育领域的应用 AI知识管理正深刻重塑教育生态,通过智能索引、语义理解与个性化推荐,将碎片化教学资源转化为可检索、可推理、可演化的结构化知识网络。教师可借助自…...

毕业论文神器!2026年必备AI论文软件榜单,免费版也能写合规初稿

2026 年实测 10 款主流 AI 论文工具,千笔AI以全流程覆盖 语义级降重 免费查重领跑综合榜;ThouPen 稳坐留学生毕业全流程工具头把交椅;免费工具中DeepSeek Scholar、豆包学术版表现亮眼,30 分钟即可生成万字高质量初稿&#xff0…...

显卡驱动彻底清理解决方案:Display Driver Uninstaller专业使用指南

显卡驱动彻底清理解决方案:Display Driver Uninstaller专业使用指南 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/display-drivers…...

3分钟解决Mac与Windows文件交换难题:Nigate免费NTFS读写工具完全指南

3分钟解决Mac与Windows文件交换难题:Nigate免费NTFS读写工具完全指南 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and…...

Switch大气层系统终极指南:从新手到高手的完整成长路径

Switch大气层系统终极指南:从新手到高手的完整成长路径 【免费下载链接】Atmosphere-stable 大气层整合包系统稳定版 项目地址: https://gitcode.com/gh_mirrors/at/Atmosphere-stable 想要彻底释放你的Switch游戏潜力吗?大气层系统(A…...

Go语言CI/CD流水线实践

Go语言CI/CD流水线实践 引言 CI/CD(持续集成/持续部署)是现代软件开发的核心实践。本文将深入探讨如何为Go语言项目构建高效的CI/CD流水线。 一、CI/CD概述 1.1 CI/CD流程 代码提交 -> 代码审查 -> 构建 -> 测试 -> 部署 -> 监控1.2 关键…...

3分钟搞定Windows桌面整理:NoFences免费开源工具终极指南

3分钟搞定Windows桌面整理:NoFences免费开源工具终极指南 【免费下载链接】NoFences 🚧 Open Source Stardock Fences alternative 项目地址: https://gitcode.com/gh_mirrors/no/NoFences 你是否每天都要在杂乱的Windows桌面上寻找文件&#xff…...

边缘计算部署:将计算能力延伸到网络边缘

边缘计算部署:将计算能力延伸到网络边缘 一、边缘计算部署概述 1.1 边缘计算部署的定义 边缘计算部署是指将计算资源和应用服务部署到靠近数据源或用户的网络边缘位置的过程。它通过在边缘位置处理数据,减少延迟,提高响应速度,并降…...

构建可持续的阅读书源生态:从基础导入到高级管理策略

构建可持续的阅读书源生态:从基础导入到高级管理策略 【免费下载链接】Yuedu 📚「阅读」自用书源分享 项目地址: https://gitcode.com/gh_mirrors/yu/Yuedu 在数字阅读日益普及的今天,阅读APP已成为广大书迷获取内容的重要渠道。然而&…...

分布式系统测试:验证分布式系统的正确性和性能

分布式系统测试:验证分布式系统的正确性和性能 一、分布式系统测试概述 1.1 分布式系统测试的定义 分布式系统测试是指对分布式系统进行验证和评估的过程,包括功能测试、性能测试、可靠性测试和安全性测试等方面。它确保分布式系统在各种场景下都能正确、…...

当Agent开始质疑你的原始数据——AI驱动的数据质量自治体系构建(含动态污点追踪与因果溯源模块)

更多请点击: https://intelliparadigm.com 第一章:当Agent开始质疑你的原始数据——AI驱动的数据质量自治体系构建(含动态污点追踪与因果溯源模块) 在传统数据治理范式中,数据质量校验往往滞后于数据摄入,…...

【Appium 系列】第18节-重试与容错 — 移动端测试的稳定性保障

配套代码:utils/retry.py、tests/test_login_api.py说明:本节所有代码示例均来自一个真实的移动端自动化测试项目,已做模糊化处理。为什么需要重试移动端测试比 Web 测试更容易出现偶发性失败。以下几种情况在本地和 CI 上反复出现&#xff1…...

小模型爆发出惊人能量!斯坦福开源框架AgentFlow如何实现复杂任务中的可靠工具使用?

本文介绍了斯坦福大学开源的模块化智能体框架AgentFlow,它通过独特的架构设计和训练方法,在工具集成和规划能力上取得了突破性进展。AgentFlow以Qwen-2.5-7B-Instruct为基础,在10个基准测试中表现突出,超越了大50倍的模型和GPT-4o…...

大模型底座的技术路线

主流大模型目前以token为单位处理文本,因其算力效率高、生态成熟。但byte-level/tokenizer-free路线正快速发展,它更端到端、跨语言统一且对噪声文本鲁棒。未来几年,外部接口可能仍用token,内部却将更多采用byte、patch或latent s…...

SenseNova-U1多模态模型深度解析:NEO-unify架构如何颠覆传统

SenseNova-U1多模态模型深度解析:NEO-unify架构如何颠覆传统 副标题: 从视觉编码器到端到端统一,附实战应用指南 一、痛点:为什么多模态模型这么复杂? 很多开发者第一次接触多模态模型时,会被各种架构绕晕:视觉编码器、文本解码器、适配器、投影层… 感觉像在看天书。 …...

大脑规则:为什么你学不进去?10个科学方法提升学习效率

大脑规则:为什么你学不进去?10个科学方法提升学习效率 副标题: 从进化论到认知科学,附实战学习方案 一、痛点:为什么你总是学不进去? 你有没有这样的经历: 坐在书桌前,书翻开了,但脑子一片空白 熬夜学习,第二天效率更低,形成恶性循环 一边看视频一边回消息,结果什…...

神经网络从入门到精通:10个核心概念+8个实战代码,小白也能懂

神经网络从入门到精通:10个核心概念+8个实战代码,小白也能懂 副标题: 从像素到概念的函数映射,附完整训练流程实战 一、痛点:为什么神经网络这么难理解? 很多初学者第一次接触神经网络时,会被各种术语绕晕:神经元、权重、偏置、激活函数、反向传播、梯度下降… 感觉像…...

LangGraph多智能体工作流:从线性执行到网状协作的重构

LangGraph多智能体工作流:从线性执行到网状协作的重构 1. 标题 (Title) 为了精准覆盖核心关键词、吸引不同层次的读者(AI应用开发者、LangChain进阶学习者、多智能体系统架构师),我准备了以下4个差异化标题: 《LangGraph 重塑AI协作:告别LangChain AgentExecutor的“单线…...

Harness的配置漂移检测与自动修复

云原生时代的稳定性利器:Harness配置漂移检测与自动修复全指南 引言 痛点引入 相信每一位DevOps工程师、SRE或者运维负责人都遇到过这样的噩梦: 测试环境验证了3天的功能,上线到生产10分钟就出现503错误,排查了2小时才发现&…...

Qwen模型 LeetCode 2585. 获得分数的方法数 TypeScript实现

哇!TypeScript版本来啦~这道题用TS写起来特别优雅,类型安全又清晰!让我给你展示一个高效又易读的实现!typescript function waysToReachTarget(target: number, types: number[][]): number {const MOD 1000000007;//…...

如何重塑贴吧体验:贴吧Lite带来的极致纯净浏览革新

如何重塑贴吧体验:贴吧Lite带来的极致纯净浏览革新 【免费下载链接】TiebaLite 贴吧 Lite 项目地址: https://gitcode.com/gh_mirrors/tieb/TiebaLite 厌倦了官方贴吧应用的臃肿体验和无处不在的广告干扰?贴吧Lite作为一款革命性的第三方贴吧客户…...

终极指南:如何免费快速上手Method Draw在线SVG编辑器

终极指南:如何免费快速上手Method Draw在线SVG编辑器 【免费下载链接】Method-Draw Method Draw, the SVG Editor for Method of Action 项目地址: https://gitcode.com/gh_mirrors/me/Method-Draw 如果你正在寻找一款简单高效的在线SVG编辑器,那…...

终极指南:无需微软账户离线启用Windows Insider预览计划的完整方案

终极指南:无需微软账户离线启用Windows Insider预览计划的完整方案 【免费下载链接】offlineinsiderenroll OfflineInsiderEnroll - A script to enable access to the Windows Insider Program on machines not signed in with Microsoft Account 项目地址: http…...

《离别的最后》的内容入口:收尾场景如何被记住

从内容传播角度看,《离别的最后》的入口在“最后”这个收束动作。它不是笼统告别,而是写到一段关系、一个阶段或一次转身即将落下尾音的时刻。这首歌不适合被写成普通伤感推荐。更准确的角度,是把它放在收尾场景里:删掉草稿、收起…...