JavaScript性能优化的12种方式

news2025/3/20 23:51:10

当涉及到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 on
  ExpiresDefault "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);
});

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

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

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

相关文章

集成学习之随机森林

目录 一、集成学习的含义 二、集成学习的代表 三、集成学习的应用 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; 总结 面试题

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…

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

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

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

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