React 性能優化的手段比較多,既有代碼層面的,也有構建層面的,還涉及到運行時調優。我幫你系統性梳理一份:
🔹 一、渲染性能優化
1. 減少不必要的渲染
React.memo
:對函數組件做淺比較,避免相同 props 時重復渲染。useMemo
/useCallback
:緩存計算結果或函數引用,減少子組件 re-render。PureComponent
(class 組件):類似React.memo
,內置淺比較。
const Child = React.memo(({ value }: { value: number }) => {console.log("render child");return <div>{value}</div>;
});function App() {const [count, setCount] = useState(0);return <Child value={count} />;
}
2. 合理使用 key
key
決定 React Diff 算法的復用策略,避免用index
作為 key,優先使用唯一 id。
3. 虛擬化長列表
react-window / react-virtualized:只渲染可視區域,提高長列表性能。
import { FixedSizeList as List } from "react-window";<Listheight={400}itemCount={1000}itemSize={35}width={300}
>{({ index, style }) => <div style={style}>Row {index}</div>}
</List>
4. 避免在渲染時做重計算
不要在 JSX 里直接做大計算 / map / sort,使用
useMemo
緩存結果。
5. 減少 Context 過度渲染
Context 更新會觸發所有消費組件刷新。
優化手段:
拆分 Context
或配合 selector hook(比如
use-context-selector
)
🔹 二、構建與加載優化
1. 代碼分割
React.lazy + Suspense
路由級別拆分。dynamic import()
工具函數/圖表庫等按需加載。
2. Tree Shaking
確保打包工具能清除無用代碼(Webpack、Vite 默認支持 ES Module)。
3. 壓縮與緩存
使用 gzip 或 brotli 壓縮。
配置瀏覽器緩存策略(靜態資源 hash 命名)。
4. 使用 CDN / 按需加載依賴
比如 antd 用 babel-plugin-import 或 unplugin-import 按需引入。
🔹 三、運行時優化
1. 避免頻繁狀態更新
合并
setState
。使用 批量更新(React 18 自動啟用)。
2. 合理選擇狀態存儲位置
不要把所有狀態放在全局(Redux/Context)。
局部狀態用
useState
更高效。
3. 使用 Web Worker
把耗時計算移到 Worker,避免阻塞主線程。
4. 節流與防抖
對滾動、輸入等高頻事件處理函數加上 debounce/throttle。
🔹 四、UI & 交互優化
1. 圖片優化
懶加載(
<img loading="lazy" />
)。使用合適的格式(WebP、AVIF)。
2. 骨架屏 / 占位符
提升用戶感知性能,避免白屏。
3. Suspense + Streaming SSR
React 18 支持流式渲染,首屏更快。
🔹 五、開發階段調優工具
React Profiler:分析組件渲染耗時。
why-did-you-render:檢測不必要的 re-render。
Performance 面板(Chrome DevTools):檢查內存泄漏、渲染瓶頸。
📌 總結建議(針對你做的性能平臺項目):
表格 / 列表頁面 → 用
react-window
做虛擬滾動。路由層 →
React.lazy
懶加載頁面,避免首頁加載過大。數據計算(統計 / 過濾) → 用
useMemo
緩存。表格操作按鈕 → 用
React.memo
包裹,減少子組件重復渲染。ECharts 圖表 → 按需 import(只加載需要的圖表類型)。