React 从入门到生产(七):性能优化实战

骨架屏实战指南:React与React Native跨平台感知性能优化 骨架屏(Skeleton Screen)是一种基于人类视觉心理的前端感知性能优化技术,通过在真实内容加载前渲染结构一致的灰阶占位图,显著降低用户等待焦虑。其核心原理在于模拟DOM结构而非简单装饰,强调尺寸守恒、布局同构与语义留空,从而提升首屏可感知时间(Perceived First Paint)。相比传统loading状态,骨架屏不依赖服务端SSR或接口改造,纯前端即可落地,在React和React Native双端均具备高工程价值。典型应用场景包括电商列表页、新闻Feed流、个人资料页等数据驱动型界面, 阅读详情

创作者: Yardon  |  GitHub: github.com/YardonYan  |  版本: v1.0



性能优化的思维方式

性能优化有一条铁律:先测量,再优化。

很多开发者凭直觉去优化代码,结果往往是:花了大量时间把一些「看起来慢」的地方优化好,但真正的瓶颈根本没碰。

React 的性能问题通常出在三个地方:

  1. 不必要的重新渲染——组件被重复渲染,但 props/state 根本没变
  2. 昂贵的计算——每次渲染都在重复执行开销很大的计算
  3. 资源体积过大——JS 包太大、图片未优化、字体未压缩

优化之前,问问自己:这真的是瓶颈吗?开发模式下的 React 比生产模式慢 10 倍——你看到的卡顿可能只是开发模式的特有现象。


React.memo:阻止不必要的渲染

React 的默认行为是:父组件重新渲染时,所有子组件也重新渲染。这通常不是问题,但当组件树很大时,一次小的状态更新可能导致几十上百个组件重新渲染。

function Parent() {
  const [count, setCount] = useState(0);
  const [name, setName] = useState('Yardon');

  return (
    <div>
      <button onClick={() => setCount(c => c + 1)}>{count}</button>
      {/* HeavyComponent 的 props 没变,但每次 count 变它都重新渲染 */}
      <HeavyComponent name={name} />
    </div>
  );
}

React.memo 就像一个过滤器:如果 props 没变,就跳过渲染。

const HeavyComponent = React.memo(function HeavyComponent({ name }) {
  // 昂贵的渲染逻辑...
  console.log('渲染了');
  return <div>{name}</div>;
});

现在 count 无论如何变化,HeavyComponent 都不会重新渲染——因为它的 name prop 没变。

自定义比较函数

默认情况下 React.memo 做浅比较(===)。对于复杂对象,可以传自定义比较函数:

const areEqual = (prevProps, nextProps) => {
  return prevProps.user.id === nextProps.user.id &&
         prevProps.user.name === nextProps.user.name;
};

const UserCard = React.memo(function UserCard({ user }) {
  // 只有 user 的关键字段变化才渲染
}, areEqual);

useMemo 和 useCallback

这两个 Hook 经常被滥用。在 80% 的情况下,你不需要它们。

useMemo:记忆计算结果

function Dashboard({ transactions }) {
  // ❌ 每次渲染都重新计算
  const totals = {
    income: transactions.filter(t => t.type === 'income')
      .reduce((sum, t) => sum + t.amount, 0),
    expense: transactions.filter(t => t.type === 'expense')
      .reduce((sum, t) => sum + t.amount, 0),
  };

  return <Charts totals={totals} />;
}

function Dashboard({ transactions }) {
  // ✅ 只在 transactions 变化时重新计算
  const totals = useMemo(() => ({
    income: transactions.filter(t => t.type === 'income')
      .reduce((sum, t) => sum + t.amount, 0),
    expense: transactions.filter(t => t.type === 'expense')
      .reduce((sum, t) => sum + t.amount, 0),
  }), [transactions]);

  return <Charts totals={totals} />;
}

useCallback:保持函数引用的稳定性

function Parent() {
  const [count, setCount] = useState(0);

  // ❌ 每次渲染创建一个新函数
  const handleClick = () => {
    doSomething(count);
  };

  // ✅ 只在 count 变化时创建新函数
  const handleClick = useCallback(() => {
    doSomething(count);
  }, [count]);

  return <Child onClick={handleClick} />;
}

只有当你把函数传给 React.memo 包装的子组件,或者把函数放进 useEffect 的依赖数组时,useCallback 才有意义。单独使用它不会带来性能提升——它本身也有开销。


列表优化:key 与虚拟滚动

Key 的正确使用

// ❌ 用 index 做 key(列表元素重排时出问题)
{items.map((item, index) => <li key={index}>{item.name}</li>)}

// ✅ 用唯一标识做 key
{items.map(item => <li key={item.id}>{item.name}</li>)}

虚拟滚动

当列表有成千上万条数据时,一次性渲染所有 DOM 节点会让浏览器崩溃。虚拟滚动只渲染可视区域内的元素。

import { FixedSizeList } from 'react-window';

function VirtualList({ items }) {
  return (
    <FixedSizeList
      height={600}
      itemCount={items.length}
      itemSize={50}
      width="100%"
    >
      {({ index, style }) => (
        <div style={style}>{items[index].name}</div>
      )}
    </FixedSizeList>
  );
}

react-window 只有约 3KB,但能把 10000 条数据的渲染时间从数秒降到毫秒级。


代码分割与 Tree Shaking

动态 import

// 路由级分割
const Dashboard = lazy(() => import('./pages/Dashboard'));

// 组件级分割
const HeavyChart = lazy(() => import('./components/HeavyChart'));

Tree Shaking

Vite/Webpack 的 Tree Shaking 依赖于 ESM 的静态分析——它能在打包时移除未使用的代码。

// ❌ lodash 的 CJS 方式不支持 tree-shaking
const _ = require('lodash');
_.sortBy(data, 'name');

// ✅ 按需导入
import sortBy from 'lodash/sortBy';
sortBy(data, 'name');

图片与资源优化

// srcset 根据屏幕宽度加载不同尺寸的图片
<img
  src="/hero-1200w.webp"
  srcSet="/hero-400w.webp 400w, /hero-800w.webp 800w, /hero-1200w.webp 1200w"
  sizes="(max-width: 600px) 400px, (max-width: 1200px) 800px, 1200px"
  loading="lazy"  // 懒加载
  alt="描述"
/>

Profiler:找到真正的瓶颈

import { Profiler } from 'react';

function onRenderCallback(id, phase, actualDuration) {
  console.log(`${id} ${phase}: ${actualDuration}ms`);
}

function App() {
  return (
    <Profiler id="Navigation" onRender={onRenderCallback}>
      <Navbar />
    </Profiler>
  );
}
指标含义
actualDuration组件本次渲染的实际耗时
phasemount(首次)或 update(更新)

本章小结

技术使用场景
React.memoprops 不变的组件免渲染
useMemo昂贵的计算、防止子组件不必要的渲染
useCallback传递给 memo 组件的函数保持引用稳定
lazy + Suspense按需加载页面,减小首屏体积
react-window长列表虚拟滚动
Profiler定位真正的性能瓶颈

下一章是本系列的最后一章——我们聊聊测试与部署,让你的应用从开发环境走向线上。


📌 创作者: Yardon  |  🏠 个人网站: GlimmerAI.top

📖 本章是「React 从入门到生产」系列的第 7 章。下一章:测试与部署

🌟 如果你觉得有帮助,欢迎访问 GlimmerAI.top 查看我的更多作品。欢迎大家来观看!

React从基础入门到高级实战:React 高级主题 - 性能优化:深入探索与实践指南 在现代Web开发中,尤其是2025年的技术环境下,React应用的性能优化已成为开发者不可忽视的核心课题。随着用户对应用速度和体验的要求日益提高,React应用的规模和复杂性不断增加,性能瓶颈问题逐渐暴露。特别是在大数据渲染、实时交互、跨设备适配等场景下,如何高效优化React应用的渲染性能和资源加载效率,成为开发者面临的重大挑战。 React凭借其声明式编程和组件化设计的优势,极大地提升了开发效率。然而,在大规模应用中,若使用不当,这些优势可能转化为性能隐患。因此,深入掌握React性能优化的技术 阅读详情

相关推荐

React从基础入门到高级实战:React 实战项目 - 项目三:实时聊天应用

本文介绍如何使用 React 构建一个实时聊天应用。项目从需求分析开始,明确要实现消息实时收发、用户在线状态显示、消息历史记录等功能。技术栈选择 React 为核心框架,配合 Socket.IO 实现实时通信,Redux Toolkit 管理状态,Framer Motion 添加动画效果,最后部署到 AWS 云平台。 文章详细讲解了项目搭建过程,包括 Vite 初始化、组件拆分设计和路由配置。通过 App、Header、ChatWindow 等组件构建完整 UI,利用 React Router 实现多页面导

zimin的专栏 1563

React快速上手:从零到项目实战

本书从零开始学习React,并通过实际项目加深理解。适合初学者和希望快速掌握React的开发者。

YunWisdom 2万+

React从基础入门到高级实战:React 实战项目 - 项目二:电商平台前端

React 实战:电商平台前端开发 本文通过一个电商平台前端项目,系统讲解 React 实战开发流程。项目涵盖商品展示、购物车、结账、用户认证等核心功能,采用 React + Redux Toolkit + React Query 技术栈。 项目亮点 完整功能实现:包括商品列表、搜索、购物车管理、结账流程和用户认证 现代技术栈:使用 Redux Toolkit 管理状态,React Query 处理数据请求 最佳实践:组件化设计、路由配置、性能优化和部署上线 从零到部署:包含项目搭建、代码实现到 Verc

zimin的专栏 2139

Reactjs-popup 组件入门指南:从安装到实战应用

Reactjs-popup 是一个轻量级、功能强大的 React 弹窗组件库,它可以帮助开发者快速实现各种常见的交互式弹窗效果。这个组件库特别适合用于构建工具提示(tooltip)、模态框(modal)、子菜单(sub-menu)等多种交互场景。与同类解决方案相比,Reactjs-popup 具有配置简单、API 友好、样式可定制等优势。 ## 安装 Reactjs-popup 安装 Reac

gitblog_00447的博客 1243

Linux命令行入门:从零掌握服务器运维与Shell脚本基础

在信息化时代,操作系统是数字世界的基石,而终端命令行则是高效驾驭服务器的核心技能。无论是软件部署、服务监控还是故障排查,掌握基于Shell的指令操作都能大幅提升工程效率。从最基础的文件目录管理、文本处理,到权限控制、进程监控与网络调试,命令行提供了一套强大且可自动化的操作范式。尤其对于运维工程师和开发者而言,理解管道、重定向以及脚本化任务,意味着将重复劳动转化为可复用的自动化流程。本文从环境准备讲起,系统梳理常用Linux命令的实际场景与输出验证,并延伸至Shell脚本编写与定时任务,帮助初学者快速建立从操

weixin_30522983的博客 255

FOC-滑膜控制器SMC/滑膜观测器SMO

三相PMSM是一个非线性、强耦合的多变量控制系统,对于外界的扰动或者电机自身的参数发生变化时,传统的PI控制并不能满足实际的要求。因此可以引入滑模控制SMC,它对扰动和参数不敏感,响应速度也够快。简单来说就是,滑膜观测器就是通过采样与坐标变换得到的Ualpha,Ubeta,Ialpha,Ibeta四个参数值,获取。SMO叫滑膜观测器(Sliding Mode Observer),用于获取转子位置信息与转速信息。2、作为滑膜观测器SMO,获取电机角度与转速信息。之间的误差来设计滑膜观测器,并通过该误差。

小胡同学的工程师学习之路 1万+

reactjs-vite-tailwindcss-boilerplate核心功能揭秘:为什么它是React项目的终极选择

reactjs-vite-tailwindcss-boilerplate是一个集成了Vite、React 18、TypeScript、Vitest、Testing Library、TailwindCSS 3、Eslint和Prettier的强大项目模板,为React开发者提供了一站式的开发解决方案,帮助快速构建现代化的Web应用。 ## 🌟 核心技术栈解析 ### Vite:极速构建体验 作

gitblog_00620的博客 1943

基于DNN、CNN与SVM的串联电弧故障智能检测:从原理到嵌入式部署

在电气安全与工业物联网领域,时间序列分类是处理传感器信号、实现状态监测与故障诊断的核心技术。其原理在于从连续的信号数据中提取有效特征,并利用机器学习模型识别异常模式。这项技术的核心价值在于能够实现设备预测性维护、提升系统安全性并降低运维成本,广泛应用于智能电表、电机健康监测、电力设备保护等场景。本文聚焦于电气安全中的一个具体且危险的隐患——串联电弧故障的检测。针对这一隐蔽性强、传统方法误报率高的问题,项目深入实践了三种主流AI模型:深度神经网络、卷积神经网络和支持向量机。通过对比DNN的通用特征学习能力、C

weixin_31860973的博客 413

Playnite 便携版完整指南:U 盘装一次,多台电脑共用同一个游戏库

换电脑不想重头配一遍游戏管理工具?Playnite 便携版就是为这个场景准备的:游戏库、插件、主题、封面全部存在程序所在文件夹里,U 盘一拔一插,另一台电脑打开就是上次的样子。这篇文章带你从判定原理讲到多电脑同步方案,全部基于仓库里的真实实现。 ## 便携模式的判定原理 Playnite 怎么知道自己是不是便携版?看源码就一句话:启动时检查程序文件夹里有没有卸载器文件 `unins000.ex

gitblog_00797的博客 481

Codex App 远程 SSH 连接 autodl 配置全攻略

SSH 远程连接是开发中常用的技术,通过加密通道实现本地与远程服务器的安全通信。其原理基于非对称加密和密钥对认证,确保数据传输安全。在 AI 开发场景中,远程连接能充分利用云端 GPU 算力,同时保留本地编辑器的流畅体验。autodl 作为主流算力云平台,支持通过 SSH 接入实例,但 Codex App 等工具需额外配置。本文详细讲解如何获取 autodl 的 SSH 接入信息、配置密钥登录、填写 Codex App 远程连接参数,并解决连接拒绝、权限报错等常见问题,帮助开发者高效搭建远程开发环境。

weixin_28312391的博客 257

染色体外环状DNA:肿瘤研究新方向

染色体外环状DNA(ecDNA)是癌症中活化原癌基因扩增的主要方式。区别于常染色体,这类生物大分子主要以环状的形式存在于细胞核当中,长度分布在103-106数量级,无中心粒。ecDNA序列中包含一个或者多个基因与调控元件,结构开放,转录活性强,相比于在棒状染色体结构基因,ecDNA的生物功能活性更强。癌症中,成环的基因区域拷贝数往往增高,而超过一半的高拷贝数事件是ecDNA驱动生成。...

blackjimmy的博客 766

React 18生产环境部署指南:Nginx配置与性能优化实战

### 1.1 技术栈选择对比 | 技术组合 | 优势 | 适用场景 | |---------|------|----------| | React 18 + Nginx | 🚀 高性能静态资源服务<br>⚡ 轻量级反向代理<br>🛡️ 企业级稳定性 | 大型企业应用<br>高并发业务场景<br>SEO友好型项目 | | Vue 3 + Tomcat | 🔧 Java生态集成<br>📚

gitblog_01147的博客 683

高云FPGA系列教程(7):ARM GPIO外部中断

高云GN1NSR-4C共有16个GPIO,每个GPIO可配置成输入或输出模式,支持中断输入,触发方式可选择:上升沿、下降沿、高电平、低电平触发。中断优先级可通过NVIC进行设置,支持 0-7 级可编程中断优先级。

whik1194的博客 1375

React Scan最佳实践:开发到生产的全流程性能优化

React应用性能优化一直是前端开发者面临的重大挑战。你是否曾经遇到过这些问题: - 应用运行缓慢,但不知道具体是哪个组件导致的性能问题 - 使用React DevTools时感觉过于复杂和卡顿 - 难以区分必要渲染和不必要渲染,优化无从下手 - 在生产环境中无法实时监控性能问题 React Scan正是为了解决这些问题而生的革命性工具。它能够自动检测React应用中的性能问题,无需更改代码即...

gitblog_00041的博客 653

【EMC专题】为什么芯片规格书ESD性能中看不到MM(机器放电模型)

器件级ESD包括三种类型,HBM人体放电模型、MM机械放电模型和CDM元件充电模型。但在芯片规格书中为什么只见到HBM模型与CDM模型,却没有看到MM模型的数据?

一点硬件 450

2025年广东省职业院校技能大赛高职组“区块链技术应用”正式赛题解析答案(标准答案参阅)

某公司规划开发一个区块链供应链金融平台,包括核心企业、供应商、银行等角色,通过智能合约代码逐步构建区块链供应链金融平台的基本功能,实现银行向核心企业提供授信并发行数字凭证,企业与企业之间转让数字凭证。此外需要完成区块链供应链金融平台的前后端,实现基本的业务逻辑

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 1271

从0到1学习reactjs-vite-tailwindcss-boilerplate:新手必备的10个实用技巧

想要快速构建现代化的React应用吗?reactjs-vite-tailwindcss-boilerplate正是你需要的终极解决方案!这个强大的项目模板集成了Vite、React 18、TypeScript、TailwindCSS 3等最流行的前端技术栈,让开发变得简单高效。无论你是React新手还是有经验的开发者,这个模板都能帮你节省大量配置时间,专注于业务逻辑的实现。🚀 ## 📦 1.

gitblog_01192的博客 652

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

如何用 React 构建生产模式应用

构建和部署一个高性能的 React 应用到生产环境中并非易事,但遵循上述步骤和最佳实践将有助于确保应用的稳定性、安全性和可维护性。从项目结构、构建配置到性能优化、部署和维护,每一步都至关重要。通过使用 Create React App、环境变量、代码分割、监控工具等技术,您可以有效地管理应用的生命周期,提供流畅的用户体验。随着前端技术的不断发展,保持对新技术和工具的关注,将有助于您持续提升 React 应用的质量和性能。

My_wife_QBL的博客 1248

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

React开发者手册:从入门到精通

本书全面覆盖React的基础知识和高级技巧,适合不同水平的开发者。

YunWisdom 2398

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

5周打造20个React项目:open-source-react-courses实战指南

想要在5周内掌握React开发,打造20个实战项目吗?open-source-react-courses为你提供了完整的React学习路径和丰富的项目实战资源。这个开源项目汇集了从React基础到高级开发的全面课程指南,特别适合想要快速提升React技能的新手和中级开发者。 ## 🎯 为什么选择open-source-react-courses? open-source-react-cour

gitblog_00591的博客 696

React Stockcharts 部署指南:如何将图表应用部署到生产环境

React Stockcharts 是一个基于 ReactJS 和 d3 构建的高度可定制股票图表库,支持多种图表类型和技术指标。在前100字内,让我们明确这个强大的股票图表库的核心价值:React Stockcharts 为金融数据可视化提供了完整的解决方案,从基础K线图到复杂的技术分析指标,都能轻松实现。 ## 🚀 快速部署步骤 ### 1. 项目初始化与环境配置 首先,克隆仓库到本地

gitblog_00278的博客 882

React Bits生产环境实战:5步打造高性能动画UI

还在为React动画组件的生产环境兼容性发愁?作为一个开源的React组件集合,React Bits提供了丰富的动画、交互组件,帮助开发者构建惊艳的用户界面。本文将带你从零开始,掌握React Bits的安装配置、组件选型、定制优化与部署技巧,轻松解决90%的动画性能问题。 ## 1. 快速入门:两种安装方式对比 React Bits支持手动复制和CLI命令两种集成方式,可根据团队技术栈选择最...

gitblog_00958的博客 902

从react-transform-boilerplate到生产环境:优化React应用性能的10个技巧

react-transform-boilerplate是一个基于Webpack的React开发模板,提供热重载React组件和模块级错误处理功能,帮助开发者快速构建React应用。本文将分享10个实用技巧,助你将基于react-transform-boilerplate开发的应用顺利优化并部署到生产环境。 ## 1. 启用生产环境模式 在生产环境中,首先要确保React应用运行在生产模式下。打

gitblog_00747的博客 633

React 18 性能优化实战指南

阶段核心优化加载优化代码分割、依赖按需、资源优化渲染优化memo 缓存、并发渲染、虚拟列表交互优化防抖节流、批处理、Web Worker💡 优化不是一蹴而就的过程,而是架构设计、代码习惯与监控反馈的持续迭代。

weixin_43852569的博客 1021

Light Bootstrap Dashboard React性能优化指南:提升React管理界面加载速度的7个技巧

Light Bootstrap Dashboard React是基于React构建的现代化管理界面框架,提供了丰富的组件和模板。然而随着项目复杂度增加,界面加载速度可能会受到影响。本文将分享7个实用技巧,帮助你优化Light Bootstrap Dashboard React应用性能,打造流畅的用户体验。 ## 1. 实现路由懒加载,减少初始加载资源 React应用性能优化的首要步骤是实现路由

gitblog_00294的博客 744

在 React 项目中开启生产模式的完整指南

在 React 项目中开启生产模式的完整指南

嗨,欢迎来到我的 优快云 博客小天地!一名深耕多年的技术发烧友。在这里,我将把日常工作中积累的宝贵经验,从复杂架构设计的精妙之处,到代码优化的实战技巧,毫无保留地分享给大家。 1338
上一篇: React 从入门到生产(六):路由与导航
下一篇: React 从入门到生产(八):测试与部署
Yardon_Official
博客等级 码龄5年 800粉丝 207原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yardon_Official

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值