如何进行 JavaScript 性能优化?

要进行 JavaScript 性能优化,我们可以从多个角度进行思考,主要包括减少页面渲染时间、减少内存占用、优化代码执行效率等。以下是优化的一些方法,并结合实际项目代码示例讲解。

目录结构

  1. 减少 DOM 操作
    • 缓存 DOM 元素
    • 批量更新 DOM
  2. 优化 JavaScript 循环
    • 使用 for 循环替代 forEach
    • 减少不必要的循环
  3. 减少回流和重绘
    • 通过 requestAnimationFrame 控制动画
    • 合并 DOM 更新
  4. 延迟加载和懒加载
    • 使用 IntersectionObserver
    • 图片懒加载
  5. 避免内存泄漏
    • 使用 WeakMapWeakSet
  6. 异步操作优化
    • 使用 async/await
    • 减少回调地狱
  7. 代码分割与懒加载
    • 使用 Webpack 等工具

1. 减少 DOM 操作

缓存 DOM 元素

频繁访问 DOM 元素会导致性能问题,尤其是在循环中,应该缓存常用的 DOM 元素。

// 非优化写法
for (let i = 0; i < 1000; i++) {document.getElementById('my-element').textContent = 'Updated!';
}// 优化写法
const myElement = document.getElementById('my-element');
for (let i = 0; i < 1000; i++) {myElement.textContent = 'Updated!';
}
批量更新 DOM

避免在循环中频繁更新 DOM,使用文档片段来减少渲染次数。

// 非优化写法
for (let i = 0; i < 1000; i++) {const div = document.createElement('div');div.textContent = 'Item ' + i;document.body.appendChild(div);
}// 优化写法
const fragment = document.createDocumentFragment();
for (let i = 0; i < 1000; i++) {const div = document.createElement('div');div.textContent = 'Item ' + i;fragment.appendChild(div);
}
document.body.appendChild(fragment);

2. 优化 JavaScript 循环

使用 for 循环替代 forEach

forEach 比传统的 for 循环稍慢,尤其是对于大数组。

// 非优化写法
const arr = [1, 2, 3, 4, 5];
arr.forEach(item => {console.log(item);
});// 优化写法
for (let i = 0; i < arr.length; i++) {console.log(arr[i]);
}
减少不必要的循环

避免在每个循环中做不必要的计算,尤其是对于大数据量的处理。

// 非优化写法
const arr = [1, 2, 3, 4, 5];
for (let i = 0; i < arr.length; i++) {if (arr[i] % 2 === 0) {console.log(arr[i]);}
}// 优化写法
const evenNumbers = arr.filter(num => num % 2 === 0);
evenNumbers.forEach(num => console.log(num));

3. 减少回流和重绘

使用 requestAnimationFrame

动画时,应使用 requestAnimationFrame 来优化性能,避免频繁回流和重绘。

// 非优化写法
function animate() {document.getElementById('box').style.left = parseInt(document.getElementById('box').style.left) + 1 + 'px';requestAnimationFrame(animate);
}// 优化写法
function animate() {const box = document.getElementById('box');box.style.left = parseInt(box.style.left) + 1 + 'px';requestAnimationFrame(animate);
}
requestAnimationFrame(animate);
合并 DOM 更新

在修改样式时,尽量批量处理,减少页面的回流和重绘。

// 非优化写法
element.style.height = '100px';
element.style.width = '200px';
element.style.backgroundColor = 'red';// 优化写法
element.style.cssText = 'height: 100px; width: 200px; background-color: red;';

4. 延迟加载和懒加载

使用 IntersectionObserver

懒加载技术可以推迟图片或其他资源的加载,减少页面的初始加载时间。

const observer = new IntersectionObserver((entries, observer) => {entries.forEach(entry => {if (entry.isIntersecting) {const img = entry.target;img.src = img.getAttribute('data-src');observer.unobserve(img);}});
});const images = document.querySelectorAll('img.lazy');
images.forEach(image => observer.observe(image));

5. 避免内存泄漏

使用 WeakMapWeakSet

这些结构可以自动释放不再使用的对象,避免内存泄漏。

// 使用 WeakMap 存储对象
const weakMap = new WeakMap();
let obj = { name: 'test' };
weakMap.set(obj, 'some value');// 当 obj 失去引用时,自动销毁
obj = null;

6. 异步操作优化

使用 async/await

避免回调地狱,提升异步操作的可读性。

// 非优化写法
fetch('url').then(response => response.json()).then(data => {console.log(data);});// 优化写法
async function fetchData() {const response = await fetch('url');const data = await response.json();console.log(data);
}
fetchData();

7. 代码分割与懒加载

使用 Webpack 进行代码分割

大文件的 JavaScript 可以分割成多个较小的包,在需要时再加载,减少初始加载时间。

// Webpack 配置中启用代码分割
module.exports = {optimization: {splitChunks: {chunks: 'all',},},
};

总结

这些优化方法可以帮助提高 JavaScript 性能,尤其是在较为复杂的项目中,减少浏览器负担、提升用户体验。通过精确分析瓶颈并逐步优化,最终可以实现更高效的前端应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/62139.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CTF-PWN: 全保护下格式化字符串利用 [第一届“吾杯”网络安全技能大赛 如果能重来] 赛后学习(不会)

通过网盘分享的文件&#xff1a;如果能重来.zip 链接: https://pan.baidu.com/s/1XKIJx32nWVcSpKiWFQGpYA?pwd1111 提取码: 1111 --来自百度网盘超级会员v2的分享漏洞分析 格式化字符串漏洞,在printf(format); __int64 sub_13D7() {char format[56]; // [rsp10h] [rbp-40h]…

selenium-常见问题解决方案汇总

selenium-常见问题解决方案 selenium版本selenium代理本地浏览器页面Selenium之多窗口句柄的切换 selenium版本 selenium版本为: 3.141.0 注&#xff1a;selenium4x跟selenium3x会有不同的使用方法&#xff0c; selenium代理本地浏览器页面 利用 Selenium 库实现对 Google C…

Flask使用长连接

Flask使用flask_socketio实现websocket Python中的单例模式 在HTTP通信中&#xff0c;连接复用&#xff08;Connection Reuse&#xff09;是一个重要的概念&#xff0c;它允许客户端和服务器在同一个TCP连接上发送和接收多个HTTP请求/响应&#xff0c;而不是为每个新的请求/响…

雨晨 26100.2454 Windows 11 24H2 专业工作站 极简纯净版

文件: 雨晨 26100.2454 Windows 11 24H2 专业工作站极简 install.esd 大小: 1947043502 字节 修改时间: 2024年12月6日, 星期五, 16:38:37 MD5: 339B7FDCA0130D432A0E98957738A9DD SHA1: 2978AE0CEAF02E52EC4135200D4BDBC861E07BE8 CRC32: 8C329C89 简述&#xff1a; 由YCDIS…

[docker中首次配置git环境与时间同步问题]

11月没写东西&#xff0c;12月初赶紧水一篇。 刚开始搭建docker服务器时&#xff0c;网上找一堆指令配置好git后&#xff0c;再次新建容器后忘记怎么配了&#xff0c;&#xff0c;这次记录下。 一、git ssh指令法&#xff0c;该方法不用每次提交时输入密码 前期准备&#xff0…

MongoDB性能监控工具

mongostat mongostat是MongoDB自带的监控工具&#xff0c;其可以提供数据库节点或者整个集群当前的状态视图。该功能的设计非常类似于Linux系统中的vmstat命令&#xff0c;可以呈现出实时的状态变化。不同的是&#xff0c;mongostat所监视的对象是数据库进程。mongostat常用于…

linux下的python打包

linux下的python打包 一、pyinstaller 优点&#xff1a;打包简单&#xff0c;将整个运行环境进行打包 缺点&#xff1a;打包文件大、臃肿、启动慢 安装pyinstaller包 pip install pyinstaller 打包一个文件 pyinstaller -D app.py会在当前路径中生成build、dist文件夹还有…

Python模块之random、hashlib、json、time等内置模块语法学习

Python内置模块语法学习 random、hashlib、json、time、datetime、os等内置模块语法学习 模块 简单理解为就是一个.py后缀的一个文件 分为三种&#xff1a; 内置模块&#xff1a;python自带&#xff0c;可调用第三方模块&#xff1a;别人设计的&#xff0c;可调用自定义模块…

从ctfwiki开始的pwn之旅 5.ret2csu

ret2csu 原理 在 64 位程序中&#xff0c;函数的前 6 个参数是通过寄存器传递的&#xff0c;但是大多数时候&#xff0c;我们很难找到每一个寄存器对应的 gadgets。 这时候&#xff0c;我们可以利用 x64 下的 __libc_csu_init 中的 gadgets。这个函数是用来对 libc 进行初始…

Ceph对象存储

Ceph对象存储1.概念对象存储&#xff08;Object Storage&#xff09;是一种用于存储大量非结构化数据的架构模型它使用简单的HTTP或HTTPS协议进行文件访问&#xff0c;而不是传统的文件系统API与传统的文件系统存储方式不同&#xff0c;对象存储不是将数据存储在目录或文件夹中…

嵌入式蓝桥杯学习拓展 LCD翻转显示

通过配置SS和GS两个标志位&#xff0c;实现扫描方向的切换。 将lcd.c的REG_932X_Init函数进行部分修改。 将LCD_WriteReg(R1, 0x0000);修改为LCD_WriteReg(R1,0x0100); 将LCD_WriteReg(R96, 0x2700); 修改为LCD_WriteReg(R96, 0xA700); void REG_932X_Init1(void) {LCD_Wr…

小程序 —— Day1

组件 — view和scroll-view view 类似于HTML中的div&#xff0c;是一个块级元素 案例&#xff1a;通过view组件实现页面的基础布局 scroll-view 可滚动的视图区域&#xff0c;用来实现滚动列表效果 案例&#xff1a;实现纵向滚动效果 scroll-x属性&#xff1a;允许横向滚动…

git pull error: cannot lock ref

Git: cannot lock ref ‘refs/remotes/origin/feature/xxx’: refs/remotes/origin/feature/xxx/car’ exists; cannot create refs/remotes/origin/feature/xxx git remote prune origin重新整理服务端和本地的关联关系即可

pubmed关键词搜索技能1:待更新

1&#xff0c;白话变为领域内学术词&#xff1a; 例如&#xff0c;我想要做蛋白质糖基化修饰以功能&#xff0c;这个领域课题&#xff0c;则 第一性原理&#xff0c;首先是拆分词汇&#xff1a;糖基化&#xff08;一般比蛋白质、修饰、功能要在title中更常见&#xff0c;或者是…

iPhone手机清理软件:相册清理大师推荐

随着智能手机成为我们日常生活的必需品&#xff0c;手机中的数据日益膨胀&#xff0c;尤其是照片和视频这类容易积累的文件。对于iPhone用户来说&#xff0c;管理这些文件&#xff0c;特别是清理相册变得尤为重要。本文将介绍一款备受推崇的iPhone手机清理软件——CleanMyPhone…

SpringBoot 开源停车场管理收费系统

一、下载项目文件 下载源码项目文件口令&#xff1a; 【前端小程序地址】(3.0)&#xff1a;伏脂火器白泽知洞座/~6f8d356LNL~:/【后台管理地址】(3.0)&#xff1a;伏脂火器仇恨篆洞座/~0f4a356Ks2~:/【岗亭端地址】(3.0)&#xff1a;动作火器智汇堂多好/~dd69356K6r~:/复制口令…

网络原理之 TCP 协议

目录 1. TCP 协议格式 2. TCP 原理 (1) 确认应答 (2) 超时重传 (3) 连接管理 a) 三次握手 b) 四次挥手 (4) 滑动窗口 (5) 流量控制 (6) 拥塞控制 (7) 延时应答 (8) 捎带应答 3. TCP 特性 4. 异常情况的处理 1) 进程崩溃 2) 主机关机 (正常流程) 3) 主机掉电 (…

STM32使用RCC(Reset Clock Contorl,复位时钟控制器)配置时钟以及时钟树

RCC主要作用 设置系统时钟SYSCLK&#xff08;System Clock&#xff09;频率&#xff1b;设置AHB、APB2、APB1以及各个外设分频因子&#xff0c;从而设置HCLK、PCLK2、PCLK1以及各个外设的时钟频率&#xff1b;控制AHB、APB2、APB1这三条总线时钟以及每个外设的时钟开启&#xf…

安防视频监控平台Liveweb视频汇聚管理系统管理方案

智慧安防监控Liveweb视频管理平台能在复杂的网络环境中&#xff0c;将前端设备统一集中接入与汇聚管理。国标GB28181协议视频监控/视频汇聚Liveweb平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、…

PostGIS的历史发展

自从 GIS 软件开发以来&#xff0c;ShapeFile等格式被广泛用于存储空间数据&#xff0c;但这些文件格式文件需要特殊的软件才能读取和写入&#xff0c;并发用户可能会导致数据损坏和速度变慢&#xff0c;并且复杂的问题需要复杂的软件来处理。 因此&#xff0c;对多用户的支持、…