每个开发人员都应该知道的 10 个 JavaScript 性能优化技巧 随着 JavaScript 应用程序变得越来越复杂,性能优化变得比以往任何时候都更加重要。加载缓慢的网站可能会损失用户、转化率,最终影响收入。在本指南中,我将分享 10 种行之有效的技术,这些技术可以显著提升 JavaScript 应用程序的性能。
TL;DR - 快速价值摘要 最小化 DOM 操作- 批量操作并使用 DocumentFragments 优化循环和迭代- 使用适当的循环类型并尽可能避免嵌套循环 实现延迟加载- 仅在需要时加载资源 使用高效的数据结构- 在适当的情况下选择 Maps/Sets 而不是 Objects/Arrays 最小化重排和重绘- 结合 DOM 更改并使用 CSS 转换 防抖/节流事件处理程序- 防止过多的函数调用 代码拆分和打包——将大包拆分成更小的块 内存管理——通过适当的清理避免内存泄漏 使用 Web Workers - 将繁重的计算转移到后台线程 优化网络请求——有效地合并、压缩和缓存
- 尽量减少 DOM 操作 直接操作 DOM 的开销很大。与其进行多次单独的修改,不如将它们批量合并:
// ❌ Inefficient - Multiple DOM manipulations function addItemsSlowly(items) { const container = document.getElementById('container');
items.forEach(item => { const element = document.createElement('div'); element.textContent = item.name; container.appendChild(element); // DOM manipulation in loop! }); }
// ✅ Efficient - Batch DOM manipulations function addItemsFast(items) { const container = document.getElementById('container'); const fragment = document.createDocumentFragment();
items.forEach(item => { const element = document.createElement('div'); element.textContent = item.name; fragment.appendChild(element); // Add to fragment first });
container.appendChild(fragment); // Single DOM manipulation } 2. 优化循环和迭代 根据您的用例选择正确的循环类型:
// ✅ Use for...of for arrays when you need values for (const item of array) { console.log(item); }
// ✅ Use traditional for loop when you need indices and maximum performance for (let i = 0, len = array.length; i < len; i++) { console.log(array[i]); }
// ✅ Use forEach for functional programming style array.forEach((item, index) => { console.log(item, index); });
// ❌ Avoid for...in for arrays (it's slower and iterates over all enumerable properties) for (const index in array) { console.log(array[index]); } 3. 实现延迟加载 仅在需要时加载资源:
class LazyImageLoader { constructor() { this.imageObserver = new IntersectionObserver((entries, observer) => { entries.forEach(entry => { if (entry.isIntersecting) { const img = entry.target; img.src = img.dataset.src; img.classList.remove('lazy'); observer.unobserve(img); } }); }); }
observe() { const lazyImages = document.querySelectorAll('img[data-src]'); lazyImages.forEach(img => this.imageObserver.observe(img)); } }
// Usage const loader = new LazyImageLoader(); loader.observe(); 4. 使用高效的数据结构 为您的用例选择正确的数据结构:
// ✅ Use Map for key-value pairs with frequent additions/deletions const userMap = new Map(); userMap.set('user123', { name: 'John', email: '' });
// ✅ Use Set for unique values const uniqueIds = new Set(); unique[Ids.add('id1'); unique[Ids.add('id2'); unique[Ids.add('id1'); // Won't add duplicate
// ❌ Avoid using Array.includes() for large datasets const largeArray = Array.from({length: 10000}, (_, i) => i); const exists = largeArray.includes(5000); // O(n) operation
// ✅ Use Set for O(1) lookups instead const largeSet = new Set(largeArray); const existsInSet = largeSet.has(5000); // O(1) operation 5. 防抖动和节流事件处理程序 防止频繁事件的过多函数调用:
// Debounce - Execute only after events stop firing function debounce(func, wait) { let timeout; return function executedFunction(...args) { const later = () => { clearTimeout(timeout); func(...args); }; clearTimeout(timeout); timeout = setTimeout(later, wait); }; }
// Throttle - Execute at most once per specified interval function throttle(func, limit) { let inThrottle; return function(...args) { if (!inThrottle) { func.apply(this, args); inThrottle = true; setTimeout(() => inThrottle = false, limit); } }; }
// Usage examples const debouncedSearch = debounce((query) => { // Search API call console.log('Searching for:', query); }, 300);
const throttledScroll = throttle(() => { // Handle scroll console.log('Scrolling...'); }, 100);
document.getElementById('search').addEventListener('input', (e) => { debouncedSearch(e.target.value); });
window.addEventListener('scroll', throttledScroll); 快速性能检查表 [ ] 最小化和批量处理 DOM 操作 [ ] 根据不同场景使用合适的循环类型 [ ] 实现图片和组件的延迟加载 [ ] 选择高效的数据结构(Map/Set vs Object/Array) [ ] 消除搜索输入抖动并限制滚动处理程序 [ ] 拆分大型 JavaScript 包 [ ] 清理事件监听器和计时器 [ ] 使用 Web Workers 进行繁重计算 [ ] 通过压缩和缓存优化网络请求 [ ] 定期分析和衡量绩效 社区讨论 我在这里没有提到的常用 JavaScript 性能优化技术是什么?
我很想听听您在性能优化方面的经验。您在项目中遇到过什么具体的性能瓶颈吗?您使用什么工具来测量和监控 JavaScript 性能?
在下面发表评论,让我们讨论一下!👇
PS:性能优化是一个持续的过程。首先要进行测量,找出瓶颈,然后进行系统性的优化,并始终测试更改带来的影响。作者www.lglngy.com