当前位置: 首页 > article >正文

JavaScript性能优化的12种方式

当涉及到JavaScript性能优化时,有几个关键的方面需要考虑。下面是一些常见的JavaScript性能优化技巧和实践:

减少DOM操作:

频繁的DOM操作会导致重绘和重新布局,影响性能。建议将多个DOM操作合并为一个操作,或者使用DocumentFragment来批量插入DOM元素。

// 不推荐写法(频繁操作DOM)
const container = document.getElementById('container');
for (let i = 0; i < 1000; i++) {const element = document.createElement('div');element.textContent = 'Item ' + i;container.appendChild(element);
}// 推荐写法(合并DOM操作)
const container = document.getElementById('container');
const fragment = document.createDocumentFragment();
for (let i = 0; i < 1000; i++) {const element = document.createElement('div');element.textContent = 'Item ' + i;fragment.appendChild(element);
}
container.appendChild(fragment);

避免不必要的重绘和回流:

重绘和回流会消耗大量的计算资源。尽量避免在循环中修改样式属性或获取布局信息。如果需要对多个样式进行修改,可以使用CSS的class切换。

// 不推荐写法(频繁触发重绘和回流)
const element = document.getElementById('myElement');
for (let i = 0; i < 1000; i++) {element.style.left = i + 'px';element.style.top = i + 'px';
}// 推荐写法(使用CSS class)
const element = document.getElementById('myElement');
element.classList.add('move');// CSS样式:
// .move {
//   left: 1000px;
//   top: 1000px;
// }

使用事件委托:

将事件监听器绑定到父元素,利用事件冒泡机制来处理子元素的事件,可以减少事件处理函数的数量,提高性能。

// 不推荐写法(为每个子元素添加事件监听器)
const items = document.querySelectorAll('.item');
items.forEach((item) => {item.addEventListener('click', () => {// 处理点击事件});
});// 推荐写法(使用事件委托)
const container = document.getElementById('container');
container.addEventListener('click', (event) => {if (event.target.classList.contains('item')) {// 处理点击事件}
});

使用节流与防抖:

在处理一些高频触发的事件(如resize、scroll)时,使用节流(throttling)和防抖(debouncing)可以限制事件处理函数的执行频率,提高性能。

// 节流
function throttle(func, delay) {let timerId;return function (...args) {if (!timerId) {timerId = setTimeout(() => {func(...args);timerId = null;}, delay);}};
}// 防抖
function debounce(func, delay) {let timerId;return function (...args) {clearTimeout(timerId);timerId = setTimeout(() => {func(...args);}, delay);};
}// 使用节流处理scroll事件
window.addEventListener('scroll', throttle(handleScroll, 200));// 使用防抖处理输入事件
input.addEventListener('input', debounce(handleInput, 300));

减少网络请求:

减少HTTP请求次数可以显著提高页面加载速度。可以将多个脚本或样式表合并为单个文件,使用CSS Sprites技术来减少图片请求,使用CDN加速等。 这些是一些常见的JavaScript性能优化技巧和实践。根据实际情况,你可以选择适合你项目的优化策略来提高JavaScript代码的性能。记住,在编写优化代码之前,先进行性能测试和分析以确定哪些部分需要优化。

请注意,优化性能不仅仅限于JavaScript代码本身,也需要考虑其他因素,如网络延迟、服务器响应时间、缓存策略等。 当涉及到JavaScript性能优化时,还有几个关键的方面需要考虑。下面是一些常见的JavaScript性能优化技巧和实践:

使用Web Workers:

对于涉及大量计算或耗时操作的任务,可以将其放入Web Worker中,在后台线程中运行,避免阻塞主线程,提高页面响应性能。

// 主线程代码
const worker = new Worker('worker.js');
worker.postMessage('Hello from main thread!');
worker.onmessage = function (event) {const result = event.data;// 处理Worker返回的结果
};// worker.js代码
self.onmessage = function (event) {const message = event.data;// 执行计算或耗时操作const result = doSomeWork(message);self.postMessage(result);
};

懒加载资源:

延迟加载非关键的资源(如图片、脚本等),在用户需要时再进行加载,减少页面初始加载时间,提高用户体验。

<!-- 图片懒加载 -->
<img data-src="image.jpg" class="lazyload" alt="Lazy-loaded Image"><script>// 使用Intersection Observer检测元素是否进入视口const lazyloadImages = document.querySelectorAll('.lazyload');const observer = new IntersectionObserver(function (entries, observer) {entries.forEach(function (entry) {if (entry.isIntersecting) {const img = entry.target;img.src = img.dataset.src;observer.unobserve(img);}});});lazyloadImages.forEach(function (img) {observer.observe(img);});
</script>

使用缓存:

合理利用浏览器缓存机制,减少不必要的请求。设置正确的Cache-Control和Expires头信息,让浏览器缓存静态资源。

//设置缓存过期时间为1年(根据实际情况调整)
<IfModule mod_expires.c>ExpiresActive onExpiresDefault "access plus 1 year"
</IfModule>

代码优化和压缩:

对JavaScript代码进行优化和压缩,去除不必要的空格、注释和代码块,缩小文件体积,加快加载 通过合理的算法和数据处理方式优化代码: 假设我们需要计算一个数组中所有元素的总和,我们可

以使用reduce方法来避免显式的循环。
javascript
const numbers = [1, 2, 3, 4, 5];// 使用 reduce 方法计算数组元素的总和
const sum = numbers.reduce((acc, curr) => acc + curr, 0);console.log(sum); // 输出15

压缩和合并JavaScript文件:

利用压缩工具(如UglifyJS)对JavaScript文件进行压缩,以减小文件大小。此外,将多个JavaScript文件合并成一个文件可以减少HTTP请求次数。

使用Web Workers:

使用Web Workers可以将大量计算或耗时操作转移到后台线程中进行,避免阻塞主线程。下面是一个简单的Web Worker示例:

// 在主线程中创建Web Worker
const worker = new Worker('worker.js');// 向Web Worker发送消息
worker.postMessage({ data: 'some data' });// 接收来自Web Worker的消息
worker.onmessage = function(event) {console.log(event.data);
};

在Web Worker的代码文件worker.js中可以执行复杂的计算或耗时操作,并通过postMessage方法将结果发送回主线程。

使用事件缓存:

对于频繁触发的事件,可以使用事件缓存来减少事件处理函数的调用次数。下面是一个示例:

// 定义事件缓存标志位
let isProcessing = false;// 监听滚动事件
window.addEventListener('scroll', function() {// 如果正在处理中,则跳过本次事件if (isProcessing) return;// 设置处理中标志位isProcessing = true;// 执行滚动相关操作// 在合适的时机重置处理中标志位setTimeout(function() {isProcessing = false;}, 100);
});

通过在处理事件前设置标志位,并在合适的时机重置标志位,可以防止事件处理函数被频繁调用。

相关文章:

JavaScript性能优化的12种方式

当涉及到JavaScript性能优化时&#xff0c;有几个关键的方面需要考虑。下面是一些常见的JavaScript性能优化技巧和实践&#xff1a; 减少DOM操作&#xff1a; 频繁的DOM操作会导致重绘和重新布局&#xff0c;影响性能。建议将多个DOM操作合并为一个操作&#xff0c;或者使用Do…...

在Ubuntu上安装MEAN Stack的4个步骤

在Ubuntu上安装MEAN Stack的4个步骤为&#xff1a;1.安装MEAN&#xff1b;2.安装MongoDB&#xff1b;3.安装NodeJS&#xff0c;Git和NPM&#xff1b;4.安装剩余的依赖项。 什么是MEAN Stack&#xff1f; 平均堆栈一直在很大程度上升高为基于稳健的基于JavaScript的开发堆栈。…...

集成学习之随机森林

目录 一、集成学习的含义 二、集成学习的代表 三、集成学习的应用 1、分类问题集成。&#xff08;基学习器是分类模型&#xff09; 2、回归问题集成。&#xff08;基学习器是回归模型&#xff09; 3、特征选取集成。 四、Bagging之随机森林 1、随机森林是有多个决策树&a…...

在线JSON格式校验工具站

在线JSON校验格式化工具&#xff08;Be JSON&#xff09;在线,JSON,JSON 校验,格式化,xml转json 工具,在线工具,json视图,可视化,程序,服务器,域名注册,正则表达式,测试,在线json格式化工具,json 格式化,json格式化工具,json字符串格式化,json 在线查看器,json在线,json 在线验…...

SAP的WPS导出找不到路径怎么办;上载报错怎么办

一.打开注册编辑器 二.输入以下地址 计算机\HKEY_CLASSES_ROOT\ExcelWorksheet\Protocol\StdFileEditing\Server 去除掉EXE后面的命令即可 二&#xff1a;WPS上载文件没反应怎么办 如何切换整合模式或多组件模式-WPS学堂 根据官方操作把整合模式改成多组件模式...

Moonlight-16B-A3B: 变革性的高效大语言模型,凭借Muon优化器打破训练效率极限

近日&#xff0c;由Moonshot AI团队推出的Moonlight-16B-A3B模型&#xff0c;再次在AI领域引发了广泛关注。这款全新的Mixture-of-Experts (MoE)架构的大型语言模型&#xff0c;凭借其创新的训练优化技术&#xff0c;特别是Muon优化器的使用&#xff0c;成功突破了训练效率的极…...

rust学习笔记17-异常处理

今天聊聊rust中异常错误处理 1. 基础类型&#xff1a;Result 和 Option&#xff0c;之前判断空指针就用到过 Option<T> 用途&#xff1a;表示值可能存在&#xff08;Some(T)&#xff09;或不存在&#xff08;None&#xff09;&#xff0c;适用于无需错误信息的场景。 f…...

PyTorch系列教程:使用预训练语言模型增强文本分类

文本分类仍是自然语言处理&#xff08;NLP&#xff09;领域的一项基础任务&#xff0c;其目标是将文本数据归入预先设定的类别之中。预训练语言模型的出现极大地提升了这一领域的性能。本文将探讨如何利用 PyTorch 来利用这些模型&#xff0c;展示它们如何能增强文本分类任务。…...

LabVIEW 线性拟合

该 LabVIEW 程序实现了 线性拟合&#xff08;Linear Fit&#xff09;&#xff0c;用于计算给定一组数据点的斜率&#xff08;Slope&#xff09;和截距&#xff08;Intercept&#xff09;&#xff0c;并将结果可视化于 XY Graph 中。本案例适用于数据拟合、实验数据分析、传感器…...

nacos安装,服务注册,服务发现,远程调用3个方法

安装 点版本下载页面 服务注册 每个微服务都配置nacos的地址&#xff0c;都要知道 服务发现 2个是知道了解 远程调用基本实现 远程调用方法2&#xff0c;负载均衡API测试 远程调用方法3&#xff0c;注解 负载均衡的远程调用&#xff0c; 总结 面试题...

k8s主要控制器简述(一)ReplicaSet与Deployment

目录 一、ReplicaSet 关键特性 示例 解释 支持的 Operator 二、Deployment 1. 声明式更新 示例 2. 滚动更新 示例 3. 回滚 示例 4. ReplicaSet 管理 示例 5. 自动恢复 示例 6. 扩展和缩容 示例 示例 一、ReplicaSet ReplicaSet 是 Kubernetes 中的一个核心控…...

Java中的消息中间件对比与解析:RocketMQ vs RabbitMQ

消息中间件&#xff08;Message Queue, MQ&#xff09;是分布式系统中实现异步通信、解耦服务和流量削峰的关键组件。在Java生态中&#xff0c;RocketMQ和RabbitMQ是两个广泛应用的消息队列系统&#xff0c;但它们在设计理念、功能特性和适用场景上存在显著差异。本文将从核心功…...

Android14 Log.isLoggable判断的分析

Android14 Log.isLoggable判断的分析 文章目录 Android14 Log.isLoggable判断的分析一、前言二、答案和分析1、Log.isLoggable 设置成true2、Log.isLoggable 分析&#xff08;1&#xff09;Log.java&#xff08;2&#xff09;android_util_Log.cpp&#xff08;3&#xff09;pro…...

Mac:JMeter 下载+安装+环境配置(图文详细讲解)

&#x1f4cc; 下载JMeter 下载地址&#xff1a;https://jmeter.apache.org/download_jmeter.cgi &#x1f4cc; 无需安装 Apache官网下载 JMeter 压缩包&#xff0c;无需安装&#xff0c;下载解压后放到自己指定目录下即可。 按我自己的习惯&#xff0c;我会在用户 jane 目…...

Python IP解析器 ip2region使用

说明&#xff1a;最近需要在python项目内使用IP定位所在城市的需求&#xff0c;没有采用向外部ISP服务商API请求获取信息的方案&#xff0c;则翻了翻&#xff0c;在搞Java时很多的方案&#xff0c;在Python端反而可选择范围很小。 # 示例查询 ips ["106.38.188.214"…...

labview与西门子1500plc进行S7通讯(仿真效果)

环境&#xff1a; 1.博图V16 2.S7-PLCSIM Advanced V3.0 3.labview2020 4.HslCommunication的dll文件 运行效果图 通过使用HslCommunication的库文件来对西门子plc进行通讯 labview代码 代码打包 通过网盘分享的文件&#xff1a;labview进行s7通讯测试.rar 链接: https:/…...

Oracle 公布 Java 的五大新功能

Java 增强提案包括语言增强和性能优化&#xff0c;从 JDK 25 中的稳定值 API 开始。 随着JDK&#xff08;Java 开发工具包&#xff09;24刚刚全面上市&#xff0c;Oracle 提前透露了不久的将来即将推出的 Java 功能&#xff0c;包括增强原始装箱到空限制值类类型。 3 月 18 日…...

台式机电脑组装---电脑机箱与主板接线

台式机电脑组装—电脑机箱与主板接线 1、机箱连接主板的跳线一般主要有USB 2.0、USB 3.0、前置音频接口(HD_AUDIO)以及POWER SW、RESET SW、POWER LED、HDD LED四个主板跳线&#xff0c;这些跳线分别的含义如下。 RESET SW&#xff1a;机箱重启按键&#xff1b;注&#xff1a…...

ubuntu高并发内核参数调优 - (压测客户端调优)

业务上要求集群提供10w并发&#xff0c;10w并发听上去不是很难&#xff0c;但10w并发持续1小时呢 在业务上线之前还需要我们自己对业务进行压测&#xff0c;俗称benchmark。 压测的服务器也是需要进行性能调优的&#xff0c;以下列出调优前后的参数对比&#xff0c;更直观的分析…...

动作捕捉手套如何让虚拟现实人机交互 “触手可及”?

在虚拟与现实逐渐交融的当下&#xff0c;动作捕捉技术正以前所未有的速度革新着多个领域。 动作捕捉技术&#xff0c;简称“动捕”&#xff0c;已经从早期的影视特效制作&#xff0c;逐步拓展到游戏开发、虚拟现实、机器人控制等多个领域。 而mHandPrO数据手套作为这一领域的…...

笔记本电脑关不了机是怎么回事 这有解决方法

在快节奏的现代生活中&#xff0c;笔记本电脑已成为我们工作、学习和娱乐的得力助手。在使用电脑的过程中&#xff0c;笔记本电脑突然关不了机了&#xff0c;怎么回事&#xff1f;下面驱动人生就来讲一讲笔记本电脑不能正常关机的解决方法&#xff0c;有需要的可以来看看。 一、…...

数据库:一文掌握 MongoDB 的各种指令(MongoDB指令备忘)

文章目录 入门连接 MongoDB Shell显示数据库切换数据库显示集合运行 JavaScript 文件 CRUD创建寻找文件使用运算符查找文档读取更新删除 数据库和集合Drop创建集合其他采集功能 索引列表索引创建索引删除索引隐藏/取消隐藏索引 方便的命令 其它改变流分片集群副本集 MongoDB 此…...

麒麟操作系统作为服务器,并且需要在浏览器上调试 MATLAB

在内网环境下&#xff0c;使用麒麟操作系统作为服务器&#xff0c;并且需要在浏览器上调试 MATLAB 程序&#xff0c;这确实复杂&#xff0c;但仍然有可行的解决方案。麒麟操作系统是国产化的 Linux 发行版&#xff08;如基于 Ubuntu Kylin 或银河麒麟&#xff09;&#xff0c;因…...

给管理商场消防安全搭建消防安全培训小程序全过程

一、需求沟通 “我是管理商场消防安全的嘛&#xff0c;做这个的作用呢&#xff0c;1是商场的所有商户员工可以看平面或者视频随时自学&#xff0c; 2是我们定期培训必修课程、考试&#xff0c;这个需要留存他们的手签字的签到表确认我们讲给他们听了&#xff08;免责很重要&am…...

Flutter:页面滚动,导航栏背景颜色过渡动画

记录&#xff1a;导航默认透明&#xff0c;页面发生滚动后&#xff0c;导航背景色由0-1&#xff0c;过渡到白色背景。 view import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import package:get/get.dart; import package:redo…...

VSCode + CMake

参考文献&#xff1a; 如何用 GCC, CMake 和 Make 编译C/C代码Windows 上的 Linux 子系统&#xff1a;WSLWSL&#xff1a;桌面 UI 远程连接 RDP 配置 VScode 文章目录 CMake 配置VSCode 配置launch.jsontask.jsonc_cpp_properties.json CMake 配置 编写如下的 CmakeLists.t…...

Docker进阶篇1:什么是Docker数据卷?为什么需要Docker数据卷?Docker数据卷3种类型介绍

大家好我是木木&#xff0c;在当今快速发展的云计算与云原生时代&#xff0c;容器化技术蓬勃兴起&#xff0c;Docker 作为实现容器化的主流工具之一&#xff0c;为开发者和运维人员带来了极大的便捷 。下面我们一起开始进阶第1篇&#xff1a;什么是Docker数据卷&#xff1f;为什…...

(2025|ICLR|华南理工,任务对齐,缓解灾难性遗忘,底层模型冻结和训练早停)语言模型持续学习中的虚假遗忘

Spurious Forgetting in Continual Learning of Language Models 目录 1. 引言 2. 动机&#xff1a;关于虚假遗忘的初步实验 3. 深入探讨虚假遗忘 3.1 受控实验设置 3.2 从性能角度分析 3.3 从损失景观角度分析 3.4 从模型权重角度分析 3.5 从特征角度分析 3.6 结论 …...

从两指到三指:Robotiq机器人自适应夹持器技术解析

工业自动化离不开高效工具的支持。Robotiq机器人工具凭借其模块化设计和智能化编程技术&#xff0c;提升了设备的灵活性和操作效率。Robotiq机器人工具精准的传感器和自适应夹持器技术&#xff0c;能够满足多样化的应用需求&#xff0c;为制造业、物流和科研等领域提供可靠的解…...

【css酷炫效果】纯CSS实现悬浮弹性按钮

【css酷炫效果】纯CSS实现悬浮弹性按钮 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90492020 缘 创作随缘&#xff0c;不定时更新。 创作背景 刚看到csdn出活动了&…...