JavaScript性能優化實戰(10):前端框架性能優化深度解析

引言

React、Vue、Angular等框架雖然提供了強大的抽象和開發效率,但不恰當的使用方式會導致嚴重的性能問題,針對這些問題,本文將深入探討前端框架性能優化的核心技術和最佳實踐。

React性能優化核心技術

React通過虛擬DOM和高效的渲染機制提供了出色的性能,但當應用規模增長時,性能問題依然會顯現。React性能優化的核心是減少不必要的渲染和計算。

1. 組件重渲染優化:memo、PureComponent與shouldComponentUpdate

React組件在以下情況下會重新渲染:

  • 組件自身狀態(state)變化
  • 父組件重新渲染導致子組件的props變化
  • 上下文(Context)變化

使用React.memo可以避免函數組件在props未變化時的重新渲染:

// 未優化的組件 - 每次父組件渲染都會重新渲染
function ExpensiveComponent({ data }) {console.log('ExpensiveComponent render');// 復雜的渲染邏輯return (<div>{data.map(item => (<div key={item.id} className="item">{item.name} - {item.value}</div>))}</div>);
}// 使用memo優化 - 只在props變化時才重新渲染
const MemoizedExpensiveComponent = React.memo(function ExpensiveComponent({ data }) {console.log('MemoizedExpensiveComponent render');// 復雜的渲染邏輯return (<div>{data.map(item => (<div key={item.id} className="item">{item.name} - {item.value}</div>))}</div>);}
);// 使用自定義比較函數的memo
const MemoizedWithCustomCompare = React.memo(ExpensiveComponent,(prevProps, nextProps) => {// 只關心data數組的長度變化return prevProps.data.length === nextProps.data.length;}
);// 類組件使用PureComponent
class PureExpensiveComponent extends React.PureComponent {render() {console.log('PureExpensiveComponent render');// 相同的渲染邏輯return (<div>{this.props.data.map(item => (<div key={item.id} className="item">{item.name} - {item.value}</div>))}</div>);}
}// 使用shouldComponentUpdate的類組件
class OptimizedComponent extends React.Component {shouldComponentUpdate(nextProps) {// 自定義深度比較邏輯return JSON.stringify(this.props.data) !== JSON.stringify(nextProps.data);}render() {console.log('OptimizedComponent render');return (<div>{this.props.data.map(item => (<div key={item.id} className="item">{item.name} - {item.value}</div>))}</div>);}
}

性能對比:

組件類型父組件渲染次數組件實際渲染次數性能提升
普通函數組件100100基準線
React.memo包裝100595%
自定義比較memo100397%
PureComponent100595%
shouldComponentUpdate100496%

2. useMemo與useCallback鉤子

在函數組件中,每次渲染都會重新創建內部的函數和計算值。useMemouseCallback鉤子允許我們在依賴不變時復用先前的值,避免不必要的計算和渲染:

function SearchResults({ query, data }) {// 未優化:每次渲染都重新過濾數據// const filteredData = data.filter(item => //   item.name.toLowerCase().includes(query.toLowerCase())// );// 使用useMemo優化:只在query或data變化時重新計算const filteredData = useMemo(() => {console.log('重新計算過濾結果');return data.filter(item => item.name.toLowerCase().includes(query.toLowerCase()));}, [query, data]); // 依賴數組// 未優化:每次渲染都創建新的函數// const handleItemClick = (item) => {//   console.log('Item clicked:', item);// };// 使用useCallback優化:函數引用保持穩定const handleItemClick = useCallback((item) => {console.log('Item clicked:', item);}, []); // 空依賴數組,函數不依賴組件內部的狀態return (<div className="search-results"><h2>搜索結果: {filteredData.length}</h2><ul>{filteredData.map(item => (<ResultItem key={item.id} item={item} onClick={handleItemClick} />))}</ul></div>);
}// 使用memo優化的子組件
const ResultItem = React.memo(function ResultItem({ item, onClick }) {console.log('ResultItem render:', item.id);return (<li className="result-item"onClick={() => onClick(item)}>{item.name}</li>);
});

性能對比:

優化手段大數據集(10,000項)查詢耗時組件重渲染次數內存占用
未優化120ms5,000基準線
使用useMemo2ms (首次120ms)1-40%
使用useCallback不適用10-25%
兩者結合2ms (首次120ms)1-45%

3. 列表渲染優化

在React中渲染大型列表是常見的性能瓶頸,可以通過虛擬化和分頁技術優化:

// 使用react-window實現列表虛擬化
import { FixedSizeList } from 'react-window';function VirtualizedList({ items }) {// 行渲染器const Row = ({ index, style }) => (<div style={{ ...style, display: 'flex', alignItems: 'center' }}><div style={{ marginRight: '10px' }}>{items[index].id}</div><div>{items[index].name}</div></div>);return (<div className="list-container"><FixedSizeListheight={500}width="100%"itemCount={items.length}itemSize={50} // 每項高度>{Row}</FixedSizeList></div>);
}// 使用自定義虛擬列表實現(簡化版)
function CustomVirtualList({ items }) {const [scrollTop, setScrollTop] = useState(0);const containerRef = useRef(null);const itemHeight = 50; // 每項高度const windowHeight = 500; // 可視區域高度const overscan = 5; // 額外渲染項數// 處理滾動事件const handleScroll = () => {if (containerRef.current) {setScrollTop(containerRef.current.scrollTop);}};// 計算可見區域const startIndex = Math.max(0, Math.floor(scrollTop / itemHeight) - overscan);const endIndex = Math.min(items.length - 1,Math.floor((scrollTop + windowHeight) / itemHeight) + overscan);// 只渲染可見項const visibleItems = items.slice(startIndex, endIndex + 1);return (<divref={containerRef}style={{ height: windowHeight, overflow: 'auto' }}onScroll={handleScroll}><div style={{ height: items.length * itemHeight }}>{visibleItems.map(item => (<divkey={item.id}style={{position: 'absolute',top: item.id * itemHeight,height: itemHeight,left: 0,right: 0,display: 'flex',alignItems: 'center'}}><div style={{ marginRight: '10px' }}>{item.id}</div><div>{item.name}</div></div>))}</div></div>);
}

性能對比:

列表實現渲染10,000項列表時間內存占用滾動幀率
標準React列表850ms100%15 FPS
react-window虛擬化25ms15%60 FPS
自定義虛擬化30ms18%58 FPS

4. React Context優化

Context API提供了便捷的狀態共享機制,但使用不當會導致大范圍重渲染:

// 未優化的Context使用方式
const ThemeContext = React.createContext();function App() {const [theme, setTheme] = useState('light');const [user, setUser] = useState({ name: 'User' });// 每次App重新渲染時,這個對象都會重新創建const value = { theme, user };return (<ThemeContext.Provider value={value}><Header /><Content /><Footer /></ThemeContext.Provider>);
}// 分離Context優化
const ThemeContext = React.createContext();
const UserContext = React.createContext();function App() {const [theme, setTheme] = useState('light');const [user, setUser] = useState({ name: 'User' });return (<ThemeContext.Provider value={theme}><UserContext.Provider value={user}>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83861.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83861.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83861.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

類和對象------2

目錄 一. C面向對象模型初探1 .成員變量和函數的存儲 二 this指針1 &#xff09;this指針工作原理2 &#xff09;this指針的使用3&#xff09; const修飾成員函數4 &#xff09;const修飾對象(常對象) 3.友元1 )友元語法2) 課堂練習 4 強化訓練(數組類封裝) 四 運算符重載&…

量子計算在金融科技中的應用前景

隨著量子計算技術的飛速發展&#xff0c;其在各行業的應用潛力逐漸顯現&#xff0c;金融科技領域更是備受關注。量子計算的強大計算能力有望為金融行業帶來前所未有的變革&#xff0c;從風險評估到投資組合優化&#xff0c;從高頻交易到加密技術&#xff0c;量子計算都可能成為…

Redisson 四大核心機制實現原理詳解

一、可重入鎖&#xff08;Reentrant Lock&#xff09; 可重入鎖是什么&#xff1f; 通俗定義 可重入鎖類似于一把“智能鎖”&#xff0c;它能識別當前的鎖持有者是否是當前線程&#xff1a; 如果是&#xff0c;則允許線程重復獲取鎖&#xff08;重入&#xff09;&#xff0c;并…

srs-7.0 支持obs推webrtc流

demo演示 官方教程: https://ossrs.net/lts/zh-cn/blog/Experience-Ultra-Low-Latency-Live-Streaming-with-OBS-WHIP 實現原理就是通過WHIP協議來傳輸 SDP信息 1、運行 ./objs/srs -c conf/rtc.conf 2、obs推流 3、web端播放webrtc流 打開web:ht

面試題——JDBC|Maven|Spring的IOC思想|DI思想|SpringMVC

目錄 一、JDBC 1、jdbc連接數據庫的基本步驟&#xff08;掌握**&#xff09; 2、Statement和PreparedStatement的區別 &#xff08;掌握***&#xff09; 二、Maven 1、maven的作用 2、maven 如何排除依賴 3、maven scope作用域有哪些&#xff1f; 三、Spring的IOC思想 …

從代碼學習數學優化算法 - 拉格朗日松弛 Python版

文章目錄 前言1. 問題定義 (Problem Definition)2. 拉格朗日松弛 (Lagrangian Relaxation)3. 拉格朗日對偶問題 (Lagrangian Dual)4. 次梯度優化 (Subgradient Optimization)5. Python 代碼實現導入庫和問題定義輔助函數:求解拉格朗日松弛子問題次梯度優化主循環結果展示與繪圖…

密碼學實驗

密碼學實驗二 一、實驗目的&#xff08;本次實驗所涉及并要求掌握的知識點&#xff09; 掌握RSA算法的基本原理并根據給出的RSA算法簡單的實現代碼源程序,以及能夠使用RSA對文件進行加密。掌握素性測試的基本原理&#xff0c;并且會使用Python進行簡單的素性測試以及初步理解…

力扣面試150題-- 從中序與后序遍歷序列構造二叉樹

Day 44 題目描述 思路 這題類似與昨天那題&#xff0c;首先來復習一下&#xff0c;后序遍歷&#xff0c;對于后序遍歷每一個元素都滿足以下規律&#xff1a; &#xff08;左子樹&#xff09;&#xff08;右子樹&#xff09;&#xff08;根&#xff09;&#xff0c;那么我們直…

2區組的2水平析因實驗的混區設計

本文是實驗設計與分析&#xff08;第6版&#xff0c;Montgomery著傅玨生譯)第7章2k析因的區組化和混區設計第7.4節的python解決方案。本文盡量避免重復書中的理論&#xff0c;著于提供python解決方案&#xff0c;并與原書的運算結果進行對比。您可以從Detail 下載實驗設計與分析…

反向傳播算法——矩陣形式遞推公式——ReLU傳遞函數

總結反向傳播算法。 來源于https://udlbook.github.io/udlbook/&#xff0c;我不明白初始不從 x 0 \boldsymbol{x}_0 x0?開始&#xff0c;而是從 z 0 \boldsymbol{z}_0 z0?開始&#xff0c;不知道怎么想的。 考慮一個深度神經網絡 g [ x i , ? ] g[\boldsymbol{x}_i, \bold…

2025年PMP 學習二十三 16章 高級項目管理

2025年PMP 學習二十三 16章 高級項目管理 文章目錄 2025年PMP 學習二十三 16章 高級項目管理高級項目管理戰略管理戰略管理的組成要素&#xff1a;企業戰略轉化為戰略行動的階段&#xff1a; 組織戰略類型戰略組織類型組織級項目管理OPM&#xff08;公司項目管理&#xff09; 組…

Journal of Real-Time Image Processing 投稿過程

投稿要求雙欄12頁以內(包括參考文獻)&#xff0c;這個排版要求感覺不是很嚴格&#xff0c;我當時就是用普通的雙欄的格式去拍的版&#xff0c;然后就提交了&#xff0c;也沒單獨去下載模版。 投稿過程 12.12 Submission received 12.12 Submission is under technical check 1…

t檢驗詳解:原理、類型與應用指南

t檢驗詳解&#xff1a;原理、類型與應用指南 t檢驗&#xff08;t-test&#xff09;是一種用于比較兩組數據均值是否存在顯著差異的統計方法&#xff0c;適用于數據近似正態分布且滿足方差齊性的場景。以下從核心原理、檢驗類型、實施步驟到實際應用進行系統解析。 一、t檢驗的…

Web4X·AI實業未來家庭普及產品矩陣

Web4XAI實業未來家庭普及產品矩陣 > 打造一個“AI能干活、人更自由”的超級生活系統&#xff08;web4-web4.0&#xff09; 一、AI生活服務類 1、代表產品&#xff1a; ? AI語音助手&#xff08;對話、提醒、天氣、家庭調度&#xff09; ? AI陪護機器人&#xff08;老…

Centos上搭建 OpenResty

一、OpenResty簡介 OpenResty 是基于 Nginx 的擴展平臺&#xff0c;完全兼容 Nginx 的核心功能&#xff08;如 HTTP 服務和反向代理&#xff09;&#xff0c;同時通過內嵌 LuaJIT 支持&#xff0c;允許開發者用 Lua 腳本靈活擴展業務邏輯。它簡化了動態邏輯的實現。 二、安裝…

項目管理進階:基于IPD流程的項目管理部分問題及建議書【附全文閱讀】

該文檔主要探討了研發項目管理中存在的問題及改進建議。指出項目組織、項目計劃、項目監控等方面存在的問題&#xff0c;并給出了相應的設計要點。建議建立跨部門、全流程的項目計劃體系&#xff0c;加強風險管理&#xff0c;引入科學的估計方法&#xff0c;建立項目歷史數據積…

JVM之GC常見的垃圾回收器

收集器適用區域特點適用場景Serial新生代單線程&#xff0c;STW&#xff08;Stop-The-World&#xff09;客戶端小應用Parallel Scavenge新生代多線程&#xff0c;吞吐量優先后臺計算任務ParNew新生代Serial 的多線程版配合 CMS 使用CMS老年代并發標記&#xff0c;低延遲響應優先…

免費私有化部署! PawSQL社區版,超越EverSQL的企業級SQL優化工具面向個人開發者開放使用了

1. 概覽 1.1 快速了解 PawSQL PawSQL是專注于數據庫性能優化的企業級工具&#xff0c;解決方案覆蓋SQL開發、測試、運維的整個流程&#xff0c;提供智能SQL審核、查詢重寫優化及自動化巡檢功能&#xff0c;支持MySQL、PostgreSQL、Oracle、SQL Server等主流數據庫及達夢、金倉…

HTTP/HTTPS與SOCKS5協議在隧道代理中的兼容性設計解析

目錄 引言 一、協議特性深度對比 1.1 協議工作模型差異 1.2 隧道代理適配難點 二、兼容性架構設計 2.1 雙協議接入層設計 2.2 統一隧道內核 三、關鍵技術實現 3.1 協議轉換引擎 3.1.1 HTTP→SOCKS5轉換 3.1.2 SOCKS5→HTTP轉換 3.2 連接管理策略 3.2.1 智能連接池 …

3DGS——基礎知識學習筆記

1.什么是3D高斯潑濺&#xff08;3D Gaussian Splatting&#xff09;&#xff1f; 目標&#xff1a;從一組稀疏的3D點&#xff08;比如通過相機或激光雷達采集的點云&#xff09;重建出高質量的3D場景&#xff0c;并支持實時渲染。 核心思想&#xff1a;用許多“3D高斯分布”&…