搜索
首页web前端js教程React 性能优化技术:记忆化、延迟加载等

React Performance Optimization Techniques: Memoization, Lazy Loading, and More

构建现代 Web 应用程序时,性能是关键。用户期望应用程序快速、响应灵敏,即使是轻微的延迟也会导致沮丧。 React 虽然功能强大,但有时会遇到性能瓶颈,尤其是当应用程序规模和复杂性不断增长时。幸运的是,有多种技术可以优化性能,包括记忆、延迟加载等等。

在本指南中,我们将详细介绍一些优化 React 应用程序性能的最有效方法。我们将介绍记忆、延迟加载和 React Profiler 等工具的基础知识,以帮助您识别和修复瓶颈。让我们开始吧!

简介:为什么性能在现代 React 应用程序中很重要

将您的网络应用想象成一辆汽车——无论它的外观多么时尚,如果它性能不佳,用户体验就会受到影响。在 React 应用程序中,这种“性能”是指组件渲染的速度以及数据或状态更改时更新的效率。

随着你的 React 应用程序的扩展,不必要地重新渲染组件或一次加载大量包可能会导致性能下降。这就是为什么学习 React 性能优化 技术对于构建流畅、高性能的应用程序至关重要。

React 中的记忆化

如何有效使用 React.memo 和 useMemo

记忆化是一个奇特的词,它的意思是缓存函数调用的结果,这样你就不必每次都重新计算。在 React 中,记忆化通过记住先前渲染的结果并在没有任何更改的情况下使用缓存的结果来帮助防止不必要的重新渲染。

React.memo

让我们从 React.memo 开始。如果组件的 props 没有改变,这个高阶组件会阻止组件重新渲染。

例子:

const MyComponent = React.memo(function MyComponent({ name }) {
  console.log('Rendered');
  return <div>Hello, {name}</div>;
});

在此示例中,MyComponent 仅在 name 属性更改时重新渲染。如果传递相同的名称值,React 将跳过渲染,从而提高性能。

使用备忘录

接下来是useMemo。该钩子用于记住功能组件内昂贵的计算或值。

例子:

import { useMemo } from 'react';

function MyApp({ items }) {
  const expensiveCalculation = useMemo(() => {
    return items.reduce((total, item) => total + item.value, 0);
  }, [items]);

  return <div>Total Value: {expensiveCalculation}</div>;
}

这里,计算仅在 items 数组更改时再次运行,避免在每次渲染时重新计算相同的结果,从而节省时间。

延迟加载组件

使用 React.lazy 缩短加载时间

延迟加载是一种技术,其中组件仅在需要时才加载,而不是预先加载所有内容。这有助于减少应用程序的初始加载时间,使其感觉更快。

React 提供了一个名为 React.lazy() 的内置函数,允许您按需加载组件。

例子:

const MyComponent = React.memo(function MyComponent({ name }) {
  console.log('Rendered');
  return <div>Hello, {name}</div>;
});

在此示例中,MyComponent 仅在实际需要时才会加载。 Suspense 组件在获取组件时提供后备 UI(如加载旋转器),使用户体验更加流畅。

用于性能监控的 React Profiler

如何识别瓶颈

无法衡量的东西很难优化。这就是 React Profiler 的用武之地。React Profiler 允许您跟踪组件的性能,识别缓慢的渲染,并测量重新渲染的“成本”。

要使用 React Profiler,只需用 包装组件树即可。并提供回调函数来收集性能数据。

例子:

import { useMemo } from 'react';

function MyApp({ items }) {
  const expensiveCalculation = useMemo(() => {
    return items.reduce((total, item) => total + item.value, 0);
  }, [items]);

  return <div>Total Value: {expensiveCalculation}</div>;
}

使用 Profiler,您可以跟踪每个组件渲染所需的时间,并找到可以改进性能的区域,例如不必要的重新渲染。

其他优化策略

代码分割、事件处理优化等等

除了记忆和延迟加载之外,还有其他几种技术可以提高 React 应用程序的性能:

  1. 代码拆分:将您的应用程序分成更小的块,可以使用 Webpack 的代码拆分功能按需加载。这会减小初始包的大小。
import React, { Suspense, lazy } from 'react';

const MyComponent = lazy(() => import('./MyComponent'));

function App() {
  return (
    <suspense fallback="{<div">Loading...}>
      <mycomponent></mycomponent>
    </suspense>
  );
}
  1. 事件处理优化:使用 useCallback 钩子来记忆事件处理程序,防止它们在每次渲染时重新创建。
import { Profiler } from 'react';

function onRenderCallback(
  id, // the "id" prop of the Profiler tree that has just committed
  phase, // either "mount" (if the tree just mounted) or "update" (if it re-rendered)
  actualDuration, // time spent rendering the committed update
  baseDuration, // estimated time to render the entire subtree without memoization
  startTime, // when React began rendering this update
  commitTime, // when React committed this update
  interactions // the Set of interactions belonging to this update
) {
  console.log({ id, phase, actualDuration });
}

function MyApp() {
  return (
    <profiler id="App" onrender="{onRenderCallback}">
      <mycomponent></mycomponent>
    </profiler>
  );
}
  1. 去抖动和限制:通过去抖动或限制来优化事件侦听器,例如滚动或调整大小,以限制更新频率。
   const OtherComponent = lazy(() => import('./OtherComponent'));

结论:使用这些技术构建高性能 React 应用程序

构建快速高效的 React 应用程序需要多种技术的组合。通过将 memoization 与 React.memo 和 useMemo 结合使用,您可以防止不必要的重新渲染。 延迟加载 使用 React.lazy 的组件允许您通过仅在需要时获取组件来缩短加载时间。 React Profiler 可帮助您识别性能瓶颈并对其进行优化。

结合代码分割和事件优化等策略,您可以确保您的 React 应用程序提供流畅且响应灵敏的用户体验,即使它们的大小和复杂性不断增长。


准备好将您的 React 应用程序的性能提升到一个新的水平吗?在您的项目中尝试这些优化技术,并观察您的应用程序的速度提高!


如果您喜欢这篇文章,请考虑支持我的工作:

  • 请我喝杯咖啡
  • 预约电话寻求指导或职业建议
  • 在 Twitter 上关注我
  • 在 LinkedIn 上联系

以上是React 性能优化技术:记忆化、延迟加载等的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
Java vs JavaScript:开发人员的详细比较Java vs JavaScript:开发人员的详细比较May 16, 2025 am 12:01 AM

javaandjavascriptaredistinctlanguages:javaisusedforenterpriseandmobileapps,while javascriptifforInteractiveWebpages.1)JavaisComcompoppored,statieldinglationallyTypted,statilly tater astrunsonjvm.2)

JavaScript数据类型:浏览器和nodejs之间是否有区别?JavaScript数据类型:浏览器和nodejs之间是否有区别?May 14, 2025 am 12:15 AM

JavaScript核心数据类型在浏览器和Node.js中一致,但处理方式和额外类型有所不同。1)全局对象在浏览器中为window,在Node.js中为global。2)Node.js独有Buffer对象,用于处理二进制数据。3)性能和时间处理在两者间也有差异,需根据环境调整代码。

JavaScript评论:使用//和 / * * / * / * /JavaScript评论:使用//和 / * * / * / * /May 13, 2025 pm 03:49 PM

JavaScriptusestwotypesofcomments:single-line(//)andmulti-line(//).1)Use//forquicknotesorsingle-lineexplanations.2)Use//forlongerexplanationsorcommentingoutblocksofcode.Commentsshouldexplainthe'why',notthe'what',andbeplacedabovetherelevantcodeforclari

Python vs. JavaScript:开发人员的比较分析Python vs. JavaScript:开发人员的比较分析May 09, 2025 am 12:22 AM

Python和JavaScript的主要区别在于类型系统和应用场景。1.Python使用动态类型,适合科学计算和数据分析。2.JavaScript采用弱类型,广泛用于前端和全栈开发。两者在异步编程和性能优化上各有优势,选择时应根据项目需求决定。

Python vs. JavaScript:选择合适的工具Python vs. JavaScript:选择合适的工具May 08, 2025 am 12:10 AM

选择Python还是JavaScript取决于项目类型:1)数据科学和自动化任务选择Python;2)前端和全栈开发选择JavaScript。Python因其在数据处理和自动化方面的强大库而备受青睐,而JavaScript则因其在网页交互和全栈开发中的优势而不可或缺。

Python和JavaScript:了解每个的优势Python和JavaScript:了解每个的优势May 06, 2025 am 12:15 AM

Python和JavaScript各有优势,选择取决于项目需求和个人偏好。1.Python易学,语法简洁,适用于数据科学和后端开发,但执行速度较慢。2.JavaScript在前端开发中无处不在,异步编程能力强,Node.js使其适用于全栈开发,但语法可能复杂且易出错。

JavaScript的核心:它是在C还是C上构建的?JavaScript的核心:它是在C还是C上构建的?May 05, 2025 am 12:07 AM

javascriptisnotbuiltoncorc; saninterpretedlanguagethatrunsonenginesoftenwritteninc.1)javascriptwasdesignedAsalightweight,解释edganguageforwebbrowsers.2)Enginesevolvedfromsimpleterterterpretpreterterterpretertestojitcompilerers,典型地提示。

JavaScript应用程序:从前端到后端JavaScript应用程序:从前端到后端May 04, 2025 am 12:12 AM

JavaScript可用于前端和后端开发。前端通过DOM操作增强用户体验,后端通过Node.js处理服务器任务。1.前端示例:改变网页文本内容。2.后端示例:创建Node.js服务器。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。