面试官:react有哪些优化方式?

103 阅读4分钟

以下是 React 常用的优化方式总结表:

优化方式描述适用场景
React.memo记忆化函数组件,避免不必要的重新渲染纯展示组件,props 稳定的组件
useMemo & useCallback缓存计算结果和函数,避免重复计算或函数重新创建复杂计算、传递回调函数给子组件
代码分割与懒加载使用 React.lazySuspense 按需加载组件,减少初始加载时间页面级别组件、次要模块
减少组件的重渲染避免直接修改 state、优化 props 传递结构、拆分大组件需要控制组件更新范围的情况
虚拟化技术使用 react-window 等库实现列表虚拟化,减少渲染数据量数据量大的长列表
shouldComponentUpdate / React.PureComponent控制类组件的更新,避免不必要的重新渲染类组件、不涉及深层数据结构
惰性状态初始化使用 useState(() => { ... }) 只在初始化时执行复杂计算复杂初始状态
优化 Reconciliation 过程使用唯一的 key 属性、减少不必要的包裹标签渲染列表、深层嵌套组件
清理无用事件监听器在组件卸载时清除无用事件监听器,避免内存消耗需要全局事件监听的情况
开发工具辅助使用 React DevTools Profiler 和 Bundle Analyzer 分析性能瓶颈性能分析和打包优化
服务器端渲染(SSR)或静态生成(SSG)通过 Next.js 等框架预渲染页面,减少客户端渲染压力SEO 要求高或首屏加载速度要求高的应用

1. 使用 React.memo 进行组件记忆化

  • 对于函数组件,React.memo 可以根据 props 是否变化决定是否重新渲染组件。若 props 没有变化,React.memo 会直接返回上次渲染的结果,减少不必要的更新。
  • 适用场景:纯展示组件或者输入 props 稳定的组件。

2. 使用 useMemouseCallback 缓存值和函数

  • useMemo:用于缓存计算值,避免在每次渲染时重复执行计算。适合性能开销较大的计算操作。
  • useCallback:用于缓存函数,特别是在传递给子组件的回调函数时,避免函数在每次渲染中被重新创建。
  • 适用场景:复杂计算、需要传递函数的子组件等。

3. 代码分割与懒加载

  • 使用 React.lazySuspense 实现代码分割,按需加载组件,减少初始加载时间。
  • 可以将不重要的页面或组件进行懒加载,减少初始打包大小,提升首屏加载速度。
  • 适用场景:页面级别的组件,或者次要模块、图表等大型组件。

4. 减少组件的重渲染

  • 避免直接修改 state:要以不可变的方式更新 state,防止 state 误修改而导致不必要的重新渲染。
  • 调整 props 传递结构:尽量减少传递不必要的 props,减少组件间不必要的依赖关系。
  • 拆分组件:将较大组件拆分成小的独立组件,以便控制每个组件的更新范围。

5. 使用虚拟化技术

  • 通过列表虚拟化(如 react-windowreact-virtualized),只渲染视窗内的数据,而非一次性渲染整个列表,适合需要展示大量数据的列表。
  • 适用场景:数据量较大的长列表,如聊天记录、数据表格等。

6. 使用 shouldComponentUpdate(类组件)或 React.PureComponent

  • 在类组件中,可以通过 shouldComponentUpdate 来判断组件是否需要更新,从而控制组件的渲染。
  • React.PureComponent 通过浅比较 props 和 state 来决定组件是否需要重新渲染。
  • 适用场景:类组件,且不涉及深层数据结构的更新。

7. 使用惰性状态初始化

  • 如果 state 的初始值需要通过复杂计算得到,可以将计算逻辑放入 useState 的惰性初始化函数中,即 useState(() => { ... })。这样只会在初始化时计算一次,避免每次渲染都执行。

8. 减少 Reconciliation 过程中的工作量

  • 关键字选择性更新(如 key:当渲染列表时,使用唯一的 key 属性来帮助 React 区分元素,减少虚拟 DOM 的对比工作量。
  • 子组件不要多余包装:尽量避免使用多余的 <div> 标签包装,避免导致 DOM 树变深,影响更新效率。

9. 去除无用的事件监听器

  • 对于在组件生命周期内只需要注册一次的事件监听器,可以在组件卸载时清理,以减少内存消耗和性能负担。
  • 适用场景:需要全局事件监听的情况,如 resizescroll 等。

10. 开发工具辅助

  • React DevTools Profiler:用于分析组件的渲染时间和性能瓶颈。
  • Bundle Analyzer:查看打包体积,识别出可以优化的第三方库。

11. 使用服务器端渲染(SSR)或静态生成(SSG)

  • Next.js 等框架支持服务器端渲染和静态生成,可以将页面预渲染,减少客户端渲染工作量。
  • 适用场景:SEO 要求较高或首屏加载速度要求高的应用。