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

2025版 JavaScript性能优化实战指南从入门到精通

JavaScript作为现代Web应用的核心技术,其性能直接影响用户体验。本文将深入探讨JavaScript性能优化的各个方面,提供可落地的实战策略。

一、代码层面的优化

1. 减少DOM操作

DOM操作是JavaScript中最昂贵的操作之一:

// 不好的做法:频繁操作DOM
for (let i = 0; i < 100; i++) {document.getElementById('list').innerHTML += `<li>Item ${i}</li>`;
}// 优化做法:使用文档片段
const fragment = document.createDocumentFragment();
for (let i = 0; i < 100; i++) {const li = document.createElement('li');li.textContent = `Item ${i}`;fragment.appendChild(li);
}
document.getElementById('list').appendChild(fragment);

2. 事件委托

减少事件监听器的数量:

// 不好的做法:为每个元素添加监听器
document.querySelectorAll('button').forEach(button => {button.addEventListener('click', handleClick);
});// 优化做法:事件委托
document.getElementById('container').addEventListener('click', event => {if (event.target.tagName === 'BUTTON') {handleClick(event);}
});

3. 避免内存泄漏

// 不好的做法:可能导致内存泄漏
window.addEventListener('resize', () => {// 大量计算
});// 优化做法:适时移除事件监听
function handleResize() {// 大量计算
}window.addEventListener('resize', handleResize);// 当不再需要时
window.removeEventListener('resize', handleResize);

二、算法与数据结构优化

1. 选择合适的数据结构

// 查找操作频繁时使用Set而不是Array
const array = [1, 2, 3, 4, 5];
console.log(array.includes(3)); // O(n)const set = new Set([1, 2, 3, 4, 5]);
console.log(set.has(3)); // O(1)

2. 缓存计算结果

// 不好的做法:重复计算
function factorial(n) {if (n === 0) return 1;return n * factorial(n - 1);
}// 优化做法:记忆化
const memo = new Map();
function factorialMemo(n) {if (memo.has(n)) return memo.get(n);if (n === 0) return 1;const result = n * factorialMemo(n - 1);memo.set(n, result);return result;
}

三、异步编程优化

1. 合理使用微任务和宏任务

// 需要立即执行但不想阻塞UI使用微任务
function runMicrotask(callback) {if (typeof Promise !== 'undefined') {Promise.resolve().then(callback);} else if (typeof MutationObserver !== 'undefined') {const observer = new MutationObserver(callback);const textNode = document.createTextNode('');observer.observe(textNode, { characterData: true });textNode.data = '1';} else {setTimeout(callback, 0);}
}

2. 防抖和节流

// 防抖:连续触发只执行最后一次
function debounce(fn, delay) {let timer;return function(...args) {clearTimeout(timer);timer = setTimeout(() => fn.apply(this, args), delay);};
}// 节流:连续触发时每隔一段时间执行一次
function throttle(fn, interval) {let lastTime = 0;return function(...args) {const now = Date.now();if (now - lastTime >= interval) {fn.apply(this, args);lastTime = now;}};
}

四、网络请求优化

1. 请求合并

// 不好的做法:多个独立请求
async function fetchData() {const user = await fetch('/user');const posts = await fetch('/posts');const comments = await fetch('/comments');return { user, posts, comments };
}// 优化做法:批量请求
async function fetchBatchData() {const [user, posts, comments] = await Promise.all([fetch('/user'),fetch('/posts'),fetch('/comments')]);return { user, posts, comments };
}

2. 数据缓存

const apiCache = new Map();async function cachedFetch(url) {if (apiCache.has(url)) {return apiCache.get(url);}const response = await fetch(url);const data = await response.json();apiCache.set(url, data);return data;
}

五、渲染性能优化

1. 使用requestAnimationFrame

// 不好的做法:直接使用setTimeout做动画
function animate() {// 动画逻辑setTimeout(animate, 16);
}// 优化做法:使用requestAnimationFrame
function animate() {// 动画逻辑requestAnimationFrame(animate);
}

2. Web Workers处理密集型任务

// main.js
const worker = new Worker('worker.js');
worker.postMessage({ data: largeData });
worker.onmessage = function(event) {console.log('Result:', event.data);
};// worker.js
self.onmessage = function(event) {const result = processData(event.data);self.postMessage(result);
};

六、现代JavaScript特性利用

1. 使用Web Assembly处理性能瓶颈

// 加载并运行WebAssembly模块
WebAssembly.instantiateStreaming(fetch('module.wasm')).then(obj => {const result = obj.instance.exports.compute();console.log(result);});

2. 合理使用TypedArray

// 处理大量数值数据时
const buffer = new ArrayBuffer(1024 * 1024); // 1MB
const int32View = new Int32Array(buffer);for (let i = 0; i < int32View.length; i++) {int32View[i] = i;
}

七、工具与测量

1. 性能测量API

// 使用Performance API测量代码执行时间
function measure() {performance.mark('start');// 要测量的代码performance.mark('end');performance.measure('My Measurement', 'start', 'end');const measures = performance.getEntriesByName('My Measurement');console.log(measures[0].duration);performance.clearMarks();performance.clearMeasures();
}

2. Chrome DevTools使用技巧

  • 使用Performance面板记录和分析运行时性能

  • 使用Memory面板检测内存泄漏

  • 使用Coverage工具查找未使用的JavaScript代码

八、框架特定优化

React优化示例

// 使用React.memo避免不必要的重新渲染
const MyComponent = React.memo(function MyComponent(props) {/* 渲染使用props */
});// 使用useCallback缓存回调函数
function Parent() {const handleClick = useCallback(() => {console.log('Clicked');}, []);return <Child onClick={handleClick} />;
}

Vue优化示例

// 使用v-once标记静态内容
<template><div v-once>{{ staticContent }}</div>
</template>// 合理使用计算属性
export default {computed: {filteredList() {return this.list.filter(item => item.active);}}
}

九、构建与打包优化

1. 代码分割

// 动态导入实现按需加载
button.addEventListener('click', async () => {const module = await import('./module.js');module.doSomething();
});

2. Tree Shaking配置

确保webpack配置支持Tree Shaking:

// webpack.config.js
module.exports = {mode: 'production',optimization: {usedExports: true,}
};

十、移动端特别优化

1. 减少主线程负载

// 将非UI更新任务放到空闲期执行
function runWhenIdle(task) {if ('requestIdleCallback' in window) {requestIdleCallback(task);} else {setTimeout(task, 0);}
}

2. 触摸事件优化

// 使用passive事件监听器改善滚动性能
document.addEventListener('touchstart', onTouchStart, { passive: true });

总结

JavaScript性能优化是一个系统工程,需要从代码编写、算法选择、网络请求、渲染流程等多个维度综合考虑。关键点包括:

  1. 减少不必要的DOM操作和重绘

  2. 合理使用缓存和记忆化技术

  3. 优化算法和数据结构选择

  4. 利用现代浏览器API和硬件加速

  5. 使用性能分析工具持续监控

记住,优化应该基于实际测量而非猜测,使用性能分析工具找出真正的瓶颈,有针对性地进行优化才能获得最佳效果。

相关文章:

2025版 JavaScript性能优化实战指南从入门到精通

JavaScript作为现代Web应用的核心技术&#xff0c;其性能直接影响用户体验。本文将深入探讨JavaScript性能优化的各个方面&#xff0c;提供可落地的实战策略。 一、代码层面的优化 1. 减少DOM操作 DOM操作是JavaScript中最昂贵的操作之一&#xff1a; // 不好的做法&#x…...

FluxCD入门操作文档

文章目录 FluxCD使用文档一、入门1.1 什么是FluxCD1.2 什么是GitOps1.3 什么是持续交付1.4 什么是**Source(源)**1.5 **什么是Reconciliation(协调)**1.6 什么是**Kustomization****与 kustomize 工具的区别**1.7 什么是**Bootstrap(引导)**1.8 安装Flux CLI1.9 配置flux…...

DOM API-JS通过文档对象树操作Doc和CSS

还记得我在之前的前端文章里面老是提及的 DOM 吗&#xff0c;当时只是简单介绍了它的组成以及作用&#xff0c;今天我们就来详细聊聊 Web浏览器 先来聊聊web浏览器&#xff0c;web浏览器是非常复杂的软件&#xff0c;有许多活动部件&#xff0c;许多部件并不能由开发者通过 J…...

实现了TCP的单向通信

1. 客户端代码:Client.java package com.xie.javase.net1;import java.io.*; import java.net.*;public class Client {public static void main(String[] args) {Socket socket = null;BufferedWriter bw = null;try {// 1. 获取本机IP地址对象InetAddress localHost = Inet…...

PostgreSQL中通过查询数据插入到表的几种方法( SELECT INTO和INSERT INTO ... SELECT)

使用 SELECT INTO 创建新表 在PostgreSQL中,SELECT INTO语法有两种主要用途:创建新表和将查询结果存储到变量中(在PL/pgSQL函数或存储过程中)。以下是详细介绍: 1. 创建新表并复制数据(类似SQL标准) SELECT * INTO new_table FROM existing_table WHERE condition;说…...

STM32项目实战:ADC采集

STM32F103C8T6的ADC配置。PB0对应的是ADC1的通道8。在标准库中&#xff0c;需要初始化ADC&#xff0c;设置通道&#xff0c;时钟&#xff0c;转换模式等。需要配置GPIOB的第0脚为模拟输入模式&#xff0c;然后配置ADC1的通道8&#xff0c;设置转换周期和触发方式。 接下来是I2C…...

CYT4BB Dual Bank - 安全启动

本节介绍TRAVEO™ T2G微控制器(MCU)的启动顺序。有关TRAVEO™ T2G微控制器的安全特性、不同的生命周期阶段以及“安全启动”序列的详细描述,请参阅 AN228680 -Secure system configuration in TRAVEO™ T2G family.   TRAVEO™ T2G微控制器(MCU)的启动序列(见图3)基于…...

Windows系统下MySQL 8.4.5压缩包安装详细教程

一、MySQL 8.4.5新特性概览 相较于旧版本&#xff0c;MySQL 8.4.5在性能与功能上实现了显著提升&#xff1a; 性能优化&#xff1a;官方测试显示&#xff0c;在高并发场景下&#xff0c;其读写性能较5.7版本提升近2倍&#xff0c;尤其在处理热点数据竞争问题时表现更为出色。…...

科技行业智能化升级经典案例—某芯片公司

案例标题 CSGHub赋能某芯片公司&#xff1a;国产AI芯片全链路管理平台的高效落地与生态共建 执行摘要 某芯片公司在开发内部模型管理平台时&#xff0c;选择AgenticOps体系中的CSGHub作为核心工具&#xff0c;通过其本地化部署能力、中文支持及RESTful API接口&#xff0c;解决…...

Python编程从入门到实践 PDF 高清版

各位程序员朋友们&#xff0c;还在为找不到合适的Python学习资料而烦恼吗&#xff1f;还在为晦涩难懂的编程书籍而头疼吗&#xff1f;今天&#xff0c;就给大家带来一份重磅福利——237完整版PDF&#xff0c; 我用网盘分享了「Python编程&#xff1a;从入门到实践__超清版.pdf…...

互联网大厂Java求职面试:Spring Cloud微服务架构与AI集成挑战

互联网大厂Java求职面试&#xff1a;Spring Cloud微服务架构与AI集成挑战 引言 在当前快速发展的互联网行业中&#xff0c;Java开发者在面对复杂的分布式系统设计时&#xff0c;需要掌握从微服务架构到AI模型集成的多种技能。本文通过一场模拟面试&#xff0c;深入探讨了基于…...

MySQL中索引最左前缀法则、索引失效情况、前缀索引、索引设计原则

最左前缀法则 联合索引中&#xff0c;最左前缀法则指的是查询从索引的最左列开始&#xff0c;并且不跳过索引中的列&#xff0c;如果跳跃某一列&#xff0c;索引将会部分失效&#xff08;后面的字段索引失效&#xff09;举例假设有一个联合索引包含三个字段按顺序&#xff1a;…...

⚡ Linux Debian 安装与配置 Docker

&#x1f427; Linux Debian 安装与配置 Docker &#x1f4e6; 1. Docker 简介 Docker 是一个开源的应用容器引擎&#xff0c;它允许开发者将应用及其依赖打包到一个标准化的镜像中&#xff0c;然后在任何地方快速部署和运行。 Docker 利用了 Linux 的 容器技术&#xff08;N…...

系统性能不达标,如何提升用户体验?

当系统性能不达标时&#xff0c;要想有效提升用户体验&#xff0c;必须从性能优化、前后端协同、用户感知改善、监控预警机制四个关键维度切入。其中&#xff0c;性能优化是最直接有效的策略&#xff0c;它通过代码优化、资源压缩、缓存机制、CDN加速等手段&#xff0c;显著提升…...

《深度掌控Linux:openEuler、CentOS、Debian、Ubuntu的全方位运维指南》

《深度掌控Linux&#xff1a;openEuler、CentOS、Debian、Ubuntu的全方位运维指南》 一、引言 在当今数字化的时代背景下&#xff0c;Linux操作系统凭借其卓越的性能、可靠性和开源的优势&#xff0c;在服务器、云计算、嵌入式系统等众多领域占据着举足轻重的地位。对于IT运维…...

Sentinel原理与SpringBoot整合实战

前言 随着微服务架构的广泛应用&#xff0c;服务和服务之间的稳定性变得越来越重要。在高并发场景下&#xff0c;如何保障服务的稳定性和可用性成为了一个关键问题。阿里巴巴开源的Sentinel作为一个面向分布式服务架构的流量控制组件&#xff0c;提供了从流量控制、熔断降级、…...

智能守护校园“舌尖安全“:AI视频分析赋能名厨亮灶新时代

引言&#xff1a; 在校园食品安全备受关注的今天&#xff0c;一套融合视频监控管理平台与AI视频分析盒子的智能解决方案正在全国多地学校食堂悄然落地&#xff0c;为传统的"名厨亮灶"工程注入科技新动能。这套系统不仅实现了后厨操作的"透明化"&#xff0…...

c++ 模板技巧——类型萃取

//traits.h/*制定输入 - 输出类型规则*/ template <class T> struct RtnType {typedef T return_type;//默认返回类型和输入类型一致 };template <class T> struct RtnType<T*> {//特化&#xff0c;当输入的是指针类型&#xff0c;返回类型规定为指针原型typ…...

初步尝试AI应用开发平台——Dify的本地部署和应用开发

随着大语言模型LLM和相关应用的流行&#xff0c;在本地部署并构建知识库&#xff0c;结合企业的行业经验或个人的知识积累进行定制化开发&#xff0c;是LLM的一个重点发展方向&#xff0c;在此方向上也涌现出了众多软件框架和工具集&#xff0c;Dify就是其中广受关注的一款&…...

卷积神经网络中的局部卷积:原理、对比与应用解析

【内容摘要】 本文聚焦卷积神经网络中的局部卷积&#xff0c;重点解析全连接、局部连接、全卷积与局部卷积四种连接方式的差异&#xff0c;结合人脸识别任务案例&#xff0c;阐述局部卷积的应用场景及优势&#xff0c;为理解卷积网络连接机制提供技术参考。 关键词&#xff1a…...

重拾童年,用 CodeBuddy 做自己的快乐创作者

某个炎炎的夏日午后&#xff0c;阳光透过稀疏的树叶洒落在地上&#xff0c;一道道光影斑驳陆离。那时候的我们&#xff0c;还只是三五个小朋友&#xff0c;蹲坐在村头的一棵老槐树下&#xff0c;手里握着并不属于自己的游戏掌机&#xff0c;轮流按动着手柄的按键&#xff0c;在…...

MyBatis-Plus的自带分页方法生成的SQL失败:The error occurred while setting parameters

1、error描述 数据库是postgres&#xff0c;Java使用mybatis-plus的分页功能&#xff0c;生成的分页SQL不能正常运行。 "msg": "nested exception is org.apache.ibatis.exceptions.PersistenceException: Error querying database. Cause: com.baomidou.my…...

Redis 的速度为什么这么快

这里的速度快&#xff0c;Redis 的速度快是与 MySQL 等数据库相比较的&#xff0c;与直接操作内存数据相比&#xff0c;Redis 还是略有逊色。 Redis 是一个单线程模型&#xff0c;为什么比其他的多线程程序还要快&#xff0c;原因有以几点&#xff1a; 1、访问的对象不同 Re…...

HarmonyOS实战:自定义时间选择器

前言 最近在日常鸿蒙开发过程中&#xff0c;经常会使用一些时间选择器&#xff0c;鸿蒙官方提供的时间选择器满足不了需求&#xff0c;所以自己动手自定义一些经常会使用到的时间选择器&#xff0c;希望能帮到你&#xff0c;建议点赞收藏&#xff01; 实现效果 需求分析 默认…...

Flannel后端为UDP模式下,分析数据包的发送方式——tun设备(三)

在分析 Kubernetes 环境中 Flannel UDP 模式的数据包转发时&#xff0c;我们提到 flannel.1 是一个 TUN 设备&#xff0c;它在数据包处理中起到了关键作用。 什么是 TUN 设备&#xff1f; TUN 设备&#xff08;Tunnel 设备&#xff09;是 Linux 系统中一种虚拟网络接口&#x…...

6:OpenCV—图像滤波

过滤图像和视频 图像滤波是一种邻域运算&#xff0c;其中输出图像中任何给定像素的值是通过对相应输入像素附近的像素值应用某种算法来确定的。该技术通常用于平滑、锐化和检测图像和视频的边缘。 让我们了解在讨论图像过滤技术、内核和卷积时使用的一些术语的含义。 内核 内…...

pytorch语法学习

启动 python main.py --config llve.yml --path_y test -i output...

5:OpenCV—图像亮度、对比度变换

1.更改图像和视频的亮度 更改亮度 更改图像的亮度是常用的点操作。在此操作中&#xff0c;图像中每个像素的值应增加/减少一个常数。要更改视频的亮度&#xff0c;应对视频中的每一帧执行相同的操作。 如果要增加图像的亮度&#xff0c;则必须为图像中的每个像素添加一些正常…...

Oracle 的V$ACTIVE_SESSION_HISTORY 视图

Oracle 的V$ACTIVE_SESSION_HISTORY 视图 V$ACTIVE_SESSION_HISTORY显示数据库中的 Sampled Session 活动。 它包含每秒拍摄一次的活动数据库会话的快照。如果数据库会话位于 CPU 上或正在等待不属于等待类的事件&#xff0c;则认为该会话处于活动状态。请参阅 view 以了解有…...

redis数据持久化和配置-13(配置 AOF:Appendfsync 策略)

配置 AOF&#xff1a;Appendfsync 策略 在 Redis 中配置仅附加文件 &#xff08;AOF&#xff09; 持久性机制涉及选择正确的 appendfsync 策略。此策略指示 Redis 将数据写入磁盘上的 AOF 文件的频率。策略的选择会显著影响数据安全和性能。了解这些策略之间的权衡对于确保 Re…...