文章

React 性能優化

React 性能優化

在開發 React 應用時,性能優化是確保應用運行流暢和高效的重要步驟。以下是一些常見的性能優化策略,幫助你提升 React 應用的性能。


1. 使用 React.memo

React.memo 是一個高階組件,用於對函數組件進行包裝,使其在相同的 props 不變時不重新渲染。這對於渲染頻繁的組件特別有用。

1
2
3
4
const MyComponent = React.memo(({ value }) => {
  console.log('MyComponent 渲染');
  return <div>{value}</div>;
});

2. 使用 useCallback 和 useMemo

  • useCallback:用於記憶函數,避免在每次渲染時創建新的函數實例。

    1
    2
    3
    
    const handleClick = useCallback(() => {
      // 事件處理邏輯
    }, [dependencies]);
    
  • useMemo:用於記憶計算結果,避免在每次渲染時重新計算。

    1
    2
    3
    
    const computedValue = useMemo(() => {
      return heavyComputation(value);
    }, [value]);
    

3. 避免不必要的渲染

  • 確保組件只在必須時重新渲染。可以使用 shouldComponentUpdateReact.PureComponent 來控制類組件的更新。

  • 對於函數組件,可以使用 React.memo 和自定義的 props 比較函數來決定是否需要重新渲染。

4. 使用懶加載

懶加載(Lazy Loading)可以使應用僅在需要時加載組件,這樣可以減少初始加載時間。React 提供了 React.lazySuspense 來支持懶加載。

1
2
3
4
5
6
7
8
9
const LazyComponent = React.lazy(() => import('./LazyComponent'));

function App() {
  return (
    <React.Suspense fallback={<div>加載中...</div>}>
      <LazyComponent />
    </React.Suspense>
  );
}

5. 使用虛擬化列表

對於需要渲染大量數據的情況,使用虛擬化列表可以大大提升性能。react-windowreact-virtualized 是常用的虛擬化庫。

1
2
3
4
5
6
7
8
9
10
11
12
import { FixedSizeList as List } from 'react-window';

const MyList = () => (
  <List
    height={150}
    itemCount={1000}
    itemSize={35}
    width={300}
  >
    {({ index }) => <div>Item {index}</div>}
  </List>
);

6. 避免 Inline Styles 和不必要的 JSX

將樣式和函數提取到組件外部,避免每次渲染時都創建新的實例。

1
2
3
4
5
const style = { color: 'blue' };

function MyComponent() {
  return <div style={style}>Hello</div>;
}

7. 監控性能

使用 React 的性能監控工具如 React Profiler 來檢測應用的性能瓶頸。可以通過以下方式啟用 Profiler:

1
2
3
4
5
6
7
8
9
10
11
12
13
import { Profiler } from 'react';

function onRenderCallback(id, phase, actualDuration) {
  console.log({ id, phase, actualDuration });
}

function App() {
  return (
    <Profiler id="App" onRender={onRenderCallback}>
      {/* 你的應用組件 */}
    </Profiler>
  );
}

8. 精簡 Context API 的使用

使用 Context API 時,應避免過於頻繁的更新。可以使用多個 Context,讓組件只訂閱它們所需的部分,從而減少不必要的渲染。

9. 使用 Web Workers

對於需要進行大量計算的任務,可以考慮使用 Web Workers 將計算邏輯放在背景線程中運行,減少對 UI 線程的阻塞。

10. 總結

性能優化是 React 應用開發中不可忽視的一部分。透過適當使用 memoization、懶加載、虛擬化、性能監控等技術,可以顯著提升應用的響應速度和流暢度。定期檢查和優化你的應用,確保它在不同環境中的最佳表現。

本文章以 CC BY 4.0 授權