JavaScript性能優化代碼示例

JavaScript性能優化實戰大綱

性能優化的核心目標

減少加載時間、提升渲染效率、降低內存占用、優化交互響應

代碼層面的優化實踐

避免全局變量污染,使用局部變量和模塊化開發
減少DOM操作頻率,批量處理DOM更新
使用事件委托替代大量事件監聽器
優化循環結構,減少不必要的計算
使用Web Workers處理密集型計算任務

內存管理策略

及時清除不再使用的對象引用
避免內存泄漏,注意閉包使用場景
使用弱引用(WeakMap/WeakSet)管理臨時數據
監控內存使用情況,利用DevTools分析內存快照

網絡請求優化

壓縮JavaScript文件(UglifyJS/Terser)
采用代碼分割和動態導入(Dynamic Import)
合理設置緩存策略(ETag/Cache-Control)
減少第三方庫依賴,按需加載polyfill

渲染性能提升

使用requestAnimationFrame替代setTimeout動畫
優化CSS選擇器減少重繪回流
利用硬件加速(transform/opacity)
虛擬列表技術優化長列表渲染

現代API應用

使用Intersection Observer實現懶加載
Performance API進行精確性能測量
WebAssembly處理高性能計算場景
Service Worker實現離線緩存

工具鏈配置

Webpack優化配置(Tree Shaking/Scope Hoisting)
Babel精準配置目標瀏覽器
ESLint性能相關規則檢查
持續集成中的性能基準測試

監控與分析

建立性能指標收集系統(FP/FCP/LCP)
真實用戶監控(RUM)數據采集
火焰圖分析JavaScript執行瓶頸
A/B測試驗證優化效果

常見反模式

過早優化導致的代碼可維護性下降
過度依賴微優化而忽視架構缺陷
忽視瀏覽器差異的性能假設
缺乏度量標準的盲目優化

JavaScript性能優化代碼示例

以下是幾種常見的JavaScript性能優化技巧及對應的代碼實現:

節流(Throttle)函數 防止高頻觸發事件導致性能問題

function throttle(func, limit) {let lastFunc;let lastRan;return function() {const context = this;const args = arguments;if (!lastRan) {func.apply(context, args);lastRan = Date.now();} else {clearTimeout(lastFunc);lastFunc = setTimeout(function() {if ((Date.now() - lastRan) >= limit) {func.apply(context, args);lastRan = Date.now();}}, limit - (Date.now() - lastRan));}};
}// 使用示例
window.addEventListener('resize', throttle(function() {console.log('窗口大小改變了');
}, 300));

防抖(Debounce)函數 確保在事件停止觸發后才執行函數

function debounce(func, wait) {let timeout;return function() {const context = this;const args = arguments;clearTimeout(timeout);timeout = setTimeout(() => {func.apply(context, args);}, wait);};
}// 使用示例
const input = document.getElementById('search');
input.addEventListener('keyup', debounce(function() {console.log('搜索:', input.value);
}, 500));

虛擬滾動(Virtual Scrolling) 優化長列表渲染性能

class VirtualScroll {constructor(container, items, itemHeight, renderItem) {this.container = container;this.items = items;this.itemHeight = itemHeight;this.renderItem = renderItem;this.container.style.height = `${items.length * itemHeight}px`;this.container.style.position = 'relative';this.container.style.overflow = 'auto';this.renderWindow();container.addEventListener('scroll', () => this.renderWindow());}renderWindow() {const scrollTop = this.container.scrollTop;const startIndex = Math.floor(scrollTop / this.itemHeight);const endIndex = Math.min(startIndex + Math.ceil(this.container.clientHeight / this.itemHeight),this.items.length - 1);const visibleItems = this.items.slice(startIndex, endIndex + 1);this.container.innerHTML = '';visibleItems.forEach((item, index) => {const itemElement = this.renderItem(item);itemElement.style.position = 'absolute';itemElement.style.top = `${(startIndex + index) * this.itemHeight}px`;this.container.appendChild(itemElement);});}
}// 使用示例
const container = document.getElementById('list-container');
const items = Array.from({length: 10000}, (_, i) => `Item ${i + 1}`);
new VirtualScroll(container,items,50,item => {const div = document.createElement('div');div.textContent = item;div.style.height = '50px';return div;}
);

Web Worker使用 將計算密集型任務轉移到后臺線程

// main.js
const worker = new Worker('worker.js');
worker.postMessage({data: largeArray});worker.onmessage = function(e) {console.log('計算結果:', e.data);
};// worker.js
self.onmessage = function(e) {const result = e.data.data.map(item => heavyComputation(item));self.postMessage(result);
};function heavyComputation(item) {// 復雜的計算邏輯return item * 2;
}

內存優化 避免內存泄漏

// 清除事件監聽器
const element = document.getElementById('myElement');
const handler = () => console.log('點擊事件');
element.addEventListener('click', handler);// 在不需要時移除
element.removeEventListener('click', handler);// 清除定時器
const timer = setInterval(() => {console.log('定時器運行');
}, 1000);// 在不需要時清除
clearInterval(timer);

這些代碼示例涵蓋了JavaScript性能優化的幾個關鍵方面:事件處理優化、列表渲染優化、多線程處理和內存管理。

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

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

相關文章

樹的重心(雙dfs,換根)

思路: 基于樹形 DP 的兩次遍歷(第一次dfs計算以某個初始根(這里選了 1)為根時各子樹的深度和與節點數,第二次zy進行換根操作,更新每個節點作為根時的深度和) 換根原理: 更換主根&…

官方App Store,直鏈下載macOS ,無需Apple ID,macOS10.10以上.

前言 想必很多人都有過維修老舊Mac的體驗,也有過想要重裝macos的體驗. 尤其是前者,想要重裝或者升級系統,由于官方已經無法更新,必須下載iSo鏡像 這時就會遇到死循環:想要更新macOS ,必須先使用更高版本的App Store,但要使用更高版本的App Store,必須先更新macOS !!! 如果想…

芋道生成前端界面代碼詳解

一、搜索框 1、整體架構 <ContentWrap> ... </ContentWrap><ContentWrap> 是頁面布局容器&#xff08;可能是自定義組件&#xff09;&#xff0c;包裹住頁面的內容區域。 2、el-form 表單&#xff08;搜索區域&#xff09; 2.1參數 <el-formclass&quo…

小程序入門:推廣技巧與運行數據查看解析

在當今數字化時代&#xff0c;小程序的應用愈發廣泛&#xff0c;無論是企業還是個人開發者&#xff0c;都希望自己的小程序能夠獲得更多用戶關注并順利運行。本文將詳細介紹小程序發布的流程、推廣策略以及如何查看運行數據&#xff0c;助力開發者更好地運營小程序。 一、小程…

sql server 將nvarchar長度設置成max有什么隱患

在學習 SQL Server 的過程中&#xff0c;很多開發者會選擇將 NVARCHAR 字段的長度設置為 MAX&#xff0c;以便于存儲大量文本數據。雖然這樣的設計在某些情況下可能會帶來便利&#xff0c;但卻潛藏著諸多隱患。本文將通過步驟性指導&#xff0c;幫助你理解這些隱患及其解決方式…

電商數據爬取實戰:如何挖掘隱藏的商業價值 ||電商API接口的應用價值

當你在深夜瀏覽電商平臺&#xff0c;目光被那些標注著“月銷10萬”的商品所吸引時&#xff0c;你是否曾思考過——這些驚人的數字背后隱藏著怎樣的商業秘密&#xff1f;今天&#xff0c;就讓我們化身為電商數據獵手&#xff0c;揮舞起爬蟲這把鋒利的手術刀&#xff0c;精心解剖…

??MQTT??通訊:??物聯網

??MQTT??通訊&#xff1a; ??物聯網&#xff08;IoT&#xff09;??&#xff1a;傳感器數據上報&#xff08;溫度、濕度&#xff09;、智能家居設備控制。 ??弱網絡環境??&#xff1a;移動網絡、衛星通信&#xff08;如遠程農業監測&#xff09;。 ??云端集成??…

swagger訪問不了的解決方案 http://localhost:8080/swagger-ui/index.html

確保增加 swagger 依賴 pom.xml <!-- Swagger --><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.5.0</version></dependency> 在瀏覽器打開…

在 .NET Core WebAPI 項目中,執行文件(.exe)方式運行并指定端口

? 方法一&#xff1a;使用命令行指定端口 .NET Core WebAPI 項目默認使用 Kestrel Web 服務器&#xff0c;你可以通過環境變量或命令行參數來覆蓋默認監聽地址和端口。 示例命令&#xff1a; MyApi.exe --urls "http://localhost:5001"或者綁定所有主機地址&…

前綴樹進階-經典案例詳解

前綴樹進階-經典案例詳解 一、前綴樹基礎內容回顧二、單詞搜索建議系統2.1 問題描述2.2 解題思路2.3 Java代碼實現2.4 復雜度分析 三、單詞編碼3.1 問題描述3.2 解題思路3.3 Java代碼實現3.4 復雜度分析 四、最長單詞4.1 問題描述4.2 解題思路4.3 Java代碼實現4.4 復雜度分析 我…

Redis集群實現方式

? 一、什么是 Redis 集群&#xff08;Redis Cluster&#xff09; Redis 集群是 Redis 官方在 3.0 版本引入的分布式部署方案&#xff0c;它的目標是解決以下幾個問題&#xff1a; 單個 Redis 實例容量有限&#xff08;最多只能使用一個服務器的內存&#xff09; 單點故障&am…

《中國電信運營商骨干網:歷史、現狀與未來演進》系列 第五篇:新玩家入局——中國廣電CBNNET如何構建全國一張網?

專欄引言 在中國電信、聯通、移動三足鼎立的骨干網格局中&#xff0c;一位身負特殊使命的“國家隊新兵”正加速入場。它就是中國廣電。根據2023年發布的《廣電網絡融合發展戰略》&#xff0c;其核心任務是構建一張“新型廣電網絡”。手握700MHz“黃金頻段”和5G牌照&#xff0c…

QT 國際化 翻譯 總結

目錄 生成TS文件 單純Qt Creator工程 生成ts文件方式一&#xff1a;creator方式 生成ts文件方式二&#xff1a;命令行方式 vs2019QT工程 CMake工程 生成qm文件 代碼 需要先根據ui產生ts文件&#xff0c;再根據ts文件產生qm文件&#xff0c;然后代碼加載 生成TS文件 單…

Java 中實現 Excel 導入一些疑難雜癥

在 Java 中實現 Excel 導入功能時&#xff0c;除了已討論的字段映射、類型轉換和內存管理外&#xff0c;還需注意以下關鍵問題&#xff0c;結合常見踩坑點和最佳實踐總結如下&#xff1a; ?? 一、文件與格式校驗 文件類型與版本兼容性 明確區分 .xls&#xff08;HSSF&#x…

修改Docker-compose使Uptime-Kuma支持IPV6

之前部署了一個Uptime-Kuma用來監控服務的運行&#xff0c;最近&#xff0c;在監控IPV6網絡的時候出現了一點問題&#xff0c;Docker不支持IPV6網絡&#xff1a; 解決方案&#xff1a; 修改/etc/docker/daemon.json文件 {"experimental": true,"fixed-cidr-v6&…

分布式存儲架構的優勢

分布式存儲架構通過將數據分散存儲在多個物理節點上&#xff0c;在性能、可靠性及成本效益方面展現顯著優勢&#xff0c;具體核心優勢如下&#xff1a; 一、?彈性擴展能力? 水平無縫擴容? 通過添加節點即可線性擴展存儲容量與性能&#xff0c;支持EB級數據規模&#xff0…

【4目全景】基于海思3403平臺開發4目360°全景拼接相機方案

此文主要介紹基于海思3403平臺通過實時視頻采集&拼接&融合&顯示實現實時全景空間漫游體驗&#xff0c;該模組將4路視頻拼接成一幅360全景圖&#xff0c;涉及到計算機視覺、計算機圖形學、數字視頻處理等技術。 基本開發步驟主要包括以下幾個方面&#xff1a;4路視頻…

element-plus 按鈕 展開/隱藏

文章目錄 1、小記2、頁面3、typescript事件4、測試數據5、樣式 1、小記 element-plus中el-table 的 expand,箭頭控制子項顯示&#xff0c;有點丑。 想實現類似bootstrap &#xff0c;用按鈕 展開/隱藏子項的功能 2、頁面 <!-- 表內容 --><el-table:data"tabl…

SSE(Server-Sent Events)、WebSocket和Polling的對比

1. 基本概念 協議通信模式協議層數據流向連接方式SSE服務器單向推送基于HTTP/HTTPS服務器→客戶端&#xff08;單向&#xff09;持久化TCP連接WebSocket全雙工通信獨立協議&#xff08;基于TCP&#xff09;服務器?客戶端&#xff08;雙向&#xff09;持久化TCP連接&#xff0…

不同類型的微型導軌精度降低速度有何差異?

微型導軌是一種高精度、小體積、輕量化的直線運動導軌系統&#xff0c;廣泛應用于各種需要精密直線運動的領域。其精度等級是衡量其性能的重要指標&#xff0c;不同精度等級的導軌適用于不同的應用場景。那么&#xff0c;不同類型的微型導軌精度降低速度有何差異&#xff1f; 滾…