React 性能优化:从慢到闪电般快

原文链接 React Performance Optimization: From Slow to Ligthning Fast - 作者 Mahinur Rahman

🚀 React 性能优化:从慢到闪电般快

React 本身就很快 - 但是如果你开发不留意,你会感觉它会变慢。随着应用规模变大,会带来糟糕的渲染性能,冗余的绑定和不必要的重新渲染。

本文,我们将通过掌握缓存懒加载绑定优化 的这些有用的技术来加速我们的应用。我们开始进入正文👇

💡 1. 缓存:禁止不必要的重渲染

React 的组件重渲染的频率比你想象的多。有时候,那是无足轻重的,但是,当是很庞大的组件树或者昂贵的计算参与,那它会变成应用的主要瓶颈。

✅ 在函数组件中使用 React.memo

使用 React.memo 来包裹函数组件,防止非属性变更的重渲染:

JAVASCRIPT 复制代码
const ExpensiveComponent = React.memo(({ data }) => {
  // 只有当 data 变更后,才会重渲染
  return <div>{ data }</div>
})

✅ 在昂贵的计算中使用 useMemo

JAVASCRIPT 复制代码
const sortedData = useMemo(() => {
  return heavySortFunction(data);
}, [data]);

✅ 在缓存函数中使用 useCallback

JAVASCRIPT 复制代码
const handleClick = useCallback(() => {
  doSomething();
}, []);

⚠️ 小技巧:明智使用缓存。在简单的计算中过度使用 useMemo 或者 useCallback 会损性能。

💤 2. 懒加载:只会加载我们想要的

当用户只是需要浏览一两个页面,我们为什么要加载整个应用呢?

✅ 使用React.lazy + Suspense 进行代码切割

JAVASCRIPT 复制代码
import React, { Suspense } from "react";
const AboutPage = React.lazy(() => import("./AboutPage"));

function App() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <AboutPage />
    </div>
  );
}

只有当真正渲染 AboutPage 组件,才会加载,这减少了初始化的打包大小。

📦 3. 捆绑拆分:打破整体

把我们的捆绑的代码拆分为小块,以便按需加载。

✅ 使用 react-router + 懒加载

JAVASCRIPT 复制代码
import { BrowserRouter, Routes, Route } from "react-router-dom";
const Home = lazy(() => import("./pages/Home"));
const Dashboard = lazy(() => import("./pages/Dashboard"));

<BrowserRouter>
  <Suspense fallback={<div>Loading route...</div>}>
    <Routes>
      <Route path="/" element={<Home />} />
      <Route path="/dashboard" element={<Dashboard />} />
    <Routes>
  </Suspense>
</BrowserRouter>

使用构建工具,比如 WebpackVite 或者 Parcel,它们自带了捆绑拆分的功能。

🛠 赢在性能的其他技巧

  • 使用生产构建命令行构建 npm run build 来确保 React 应用的性能
  • ✅ 在 render 函数中避免使用匿名函数
  • ✅ 在输入事件中使用防抖/节流,比如滚动事件、更改大小事件
  • 虚拟长列表 可以通过一些库,比如 react-window 或者 react-virtualized 来处理
  • 避免不必要的上下文更新 - 使用 selectors 或者 memoized providers 来处理更新

📈 衡量性能的工具

  • React DevTools Profiler - 检测组件渲染的次数
  • Lighthouse - 审查性能,可访问性等其他指标
  • Web Vitals - 跟踪真实世界的性能指标(FCPLCP , TTI

**FCP (First Contentful Paint) ** - 衡量的是从页面开始加载到页面内容任何部分在屏幕上渲染的时间。 LCP (Largest Contentful Paint) - 衡量的是从页面开始加载到页面上最大的内容元素在屏幕上渲染的时间。 TTI (Time to Interactive) - 衡量的是从页面开始到页面变得完全可以交互的时间,这意味着页面不仅要加载完成,还能够响应用户的输入。

⚡ 结语

性能是一项重要的功能 - 在满足用户需求的基础上,一个快速的应用意味着更高的用户参与度和转换率。同步应用 memoizationlazy loadingbundle splitting ,我们可以显著地提升 React 应用地速度和响应性。

相关推荐
BD_Marathon2 分钟前
NPM_配置的补充说明
前端·npm·node.js
巴拉巴拉~~7 分钟前
KMP 算法通用图表组件:KmpChartWidget 多维度可视化 + PMT 表渲染 + 性能对比
前端·javascript·microsoft
智算菩萨13 分钟前
基于spaCy的英文自然语言处理系统:低频词提取与高级文本分析
前端·javascript·easyui
刘一说23 分钟前
Vue单页应用(SPA)开发全解析:从原理到最佳实践
前端·javascript·vue.js
疯狂成瘾者24 分钟前
前端vue核心知识点
前端·javascript·vue.js
Laravel技术社区1 小时前
用PHP8实现斗地主游戏,实现三带一,三带二,四带二,顺子,王炸功能(第二集)
前端·游戏·php
m0_738120722 小时前
应急响应——知攻善防Web-3靶机详细教程
服务器·前端·网络·安全·web安全·php
hh随便起个名9 小时前
力扣二叉树的三种遍历
javascript·数据结构·算法·leetcode
我是小路路呀9 小时前
element级联选择器:已选中一个二级节点,随后又点击了一个一级节点(仅浏览,未确认选择),此时下拉框失去焦点并关闭
javascript·vue.js·elementui
程序员爱钓鱼9 小时前
Node.js 编程实战:文件读写操作
前端·后端·node.js