减少 React 应用加载时间的 5 大技巧

在构建 React 应用程序时,缩短加载时间对于提供流畅的用户体验至关重要。在本文中,我们将探索**五个实用技巧**,以最大限度地缩短 React 应用程序的加载时间,并附上示例。

1.实现代码分割

代码分割可让您将应用拆分为多个较小的包,并在必要时仅加载所需的部分。这可减少初始 JavaScript 包的大小。

示例:使用 React 的 `lazy` 和 `Suspense`

import React, { lazy, Suspense } from 'react';

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

function App() {
  return (
    
Loading...
}>
); } export default App;

解释:

  • HeavyComponent 仅在需要时加载,从而减少初始捆绑包的大小。
  • Suspense 组件提供了一个后备 UI,直到延迟加载的组件准备就绪。
  • 2.利用图像的延迟加载

    延迟加载图像可确保它们仅在视口中出现时加载,从而提高页面加载速度。

    示例:使用 `loading` 属性

    function ImageGallery() {
      return (
        
    Image 1 Image 2
    ); } export default ImageGallery;

    解释:

  • loading="lazy" 属性会延迟图像加载,直到用户滚动到它们为止。
  • 3.使用记忆法

    记忆化可以防止不必要的组件重新渲染,从而提高性能。

    示例:使用 `React.memo` 和 `useMemo`

    使用 React.memo 防止重新渲染

    const ChildComponent = React.memo(({ data }) => {
      console.log('Rendered');
      return 
    {data}
    ; }); function App() { const [state, setState] = React.useState(0); return (
    ); }

    解释:

  • React.memo 会阻止 ChildComponent 重新渲染,除非其 props 发生改变。
  • 使用 useMemo 优化昂贵的计算

    function App() {
      const [count, setCount] = React.useState(0);
    
      const expensiveCalculation = React.useMemo(() => {
        console.log('Calculating...');
        return count * 2;
      }, [count]);
    
      return (
        

    Result: {expensiveCalculation}

    ); }

    解释:

  • useMemo 会缓存计算结果,直到 count 发生变化,避免重复计算。
  • 4. 最小化 CSS 和 JavaScript

    使用 Terser 和 PostCSS 等工具缩小 CSS 和 JavaScript 的大小。

    示例:Webpack 配置

    const TerserPlugin = require('terser-webpack-plugin');
    
    module.exports = {
      optimization: {
        minimize: true,
        minimizer: [new TerserPlugin()],
      },
    };

    解释:

  • TerserPlugin 压缩 JavaScript 文件,删除不必要的字符并缩短加载时间。
  • 5.预取关键资源

    预取可确保提前加载关键资源,从而减少用户等待重要资源的时间。

    示例:使用 `rel="prefetch"` 预取链接

    解释:

  • 浏览器在后台加载指定的资源,以便在需要时更快地使用。
  • 最后的想法

    减少 React 应用的加载时间需要优化代码并利用现代工具。通过实施这五个技巧,您将为用户提供更快、更流畅的体验。

    你最喜欢的 React 性能优化技巧是什么?让我们在下面的评论中讨论!