15个每位开发者都应该知道的JavaScript性能优化技巧

文摘   2024-09-02 09:00   福建  

前端岗位内推来了

JavaScript是一种强大的语言,几乎在每个网页浏览器中都运行,为动态和交互性网站提供动力。然而,随着其强大功能的发挥,编写不当的JavaScript代码可能会拖慢网站速度,令用户沮丧,甚至影响搜索引擎排名。为了帮助你编写更快、更高效的代码,以下是每位开发者都应该知道的15个性能优化技巧。

1. 最小化DOM访问

访问和操作DOM是JavaScript中最耗费资源的操作之一。访问DOM越频繁,应用程序运行的速度就越慢。

如何优化

  • 缓存DOM元素:将DOM元素的引用存储在变量中,以避免重复查询DOM。
    // 不推荐
    for (let i = 0; i < document.querySelectorAll('.item').length; i++) {
      document.querySelectorAll('.item')[i].style.color = 'red';
    }

    // 推荐
    const items = document.querySelectorAll('.item');
    for (let i = 0; i < items.length; i++) {
      items[i].style.color = 'red';
    }
  • 批量更新DOM:将多个DOM更新分组,以减少重排和重绘的次数。

2. 使用requestAnimationFrame进行动画处理

与其使用setTimeout或setInterval进行动画处理,不如使用requestAnimationFrame。此方法将动画与浏览器的刷新率同步,从而实现更流畅的动画效果。

function animate({
  // 更新动画状态
  requestAnimationFrame(animate);
}

requestAnimationFrame(animate);

为什么有效

  • 更流畅的动画:将动画与浏览器的刷新周期对齐。
  • 更好的性能:减少不必要的重绘和重排。

3. 对事件处理程序进行防抖和节流

像scroll、resize和mousemove这样的事件每秒可以触发多次,导致性能问题。防抖和节流技术可以限制函数的执行次数。

function debounce(func, wait{
  let timeout;
  return function (...args{
    clearTimeout(timeout);
    timeout = setTimeout(() => func.apply(this, args), wait);
  };
}

function throttle(func, limit{
  let lastFunc;
  let lastRan;
  return function (...args{
    if (!lastRan) {
      func.apply(this, args);
      lastRan = Date.now();
    } else {
      clearTimeout(lastFunc);
      lastFunc = setTimeout(function ({
        if (Date.now() - lastRan >= limit) {
          func.apply(this, args);
          lastRan = Date.now();
        }
      }, limit - (Date.now() - lastRan));
    }
  };
}

为什么有效

  • 性能提升:减少昂贵的函数调用频率。
  • 增强用户体验:防止在频繁事件发生时出现UI卡顿。

4. 优化循环

循环在编程中至关重要,但如果使用不当,也会成为性能瓶颈。优化循环可以显著提高应用程序的速度。

如何优化

  • 缓存数组长度:避免在每次迭代中重新计算数组的长度。
    // 不推荐
    for (let i = 0; i < items.length; i++) {
      process(items[i]);
    }

    // 推荐
    for (let i = 0, len = items.length; i < len; i++) {
      process(items[i]);
    }
  • 使用for循环代替forEach:传统的for循环通常比forEach循环更快。

5. 避免内存泄漏

内存泄漏发生在应用程序保留了不再需要的内存时。这会导致性能下降,最终可能导致应用程序崩溃。

如何避免

  • 分离事件监听器:在不再需要时总是移除事件监听器。
    const element = document.getElementById('myElement');
    function handleClick({
      console.log('Clicked!');
    }
    element.addEventListener('click', handleClick);

    // 稍后,移除事件监听器
    element.removeEventListener('click', handleClick);
  • 避免全局变量:全局变量在应用程序的生命周期内始终存在,若处理不当可能导致内存泄漏。

6. 压缩和最小化代码

最小化你的JavaScript代码会去除不必要的字符,如空白和注释,从而减少文件的大小。压缩则通过更高效的格式编码进一步减少文件大小。

使用工具

  • 最小化:UglifyJS, Terser
  • 压缩:Gzip, Brotli

为什么有效

  • 更快的加载时间:较小的文件下载速度更快,提升页面加载速度。
  • 减少带宽使用:减少带宽消耗,尤其对移动用户非常重要。

7. 延迟加载图片和资源

延迟加载将非关键资源(如图片)的加载推迟到需要时。此技术可以显著改善网页的初始加载时间。

<img src="placeholder.jpg" src="real-image.jpg" class="lazyload">

<script>
document.addEventListener('DOMContentLoaded'function({
  const lazyImages = [].slice.call(document.querySelectorAll('.lazyload'));
  if ('IntersectionObserver' in window) {
    const lazyImageObserver = new IntersectionObserver(function(entries, observer{
      entries.forEach(function(entry{
        if (entry.isIntersecting) {
          const lazyImage = entry.target;
          lazyImage.src = lazyImage.dataset.src;
          lazyImage.classList.remove('lazyload');
          lazyImageObserver.unobserve(lazyImage);
        }
      });
    });
    lazyImages.forEach(function(lazyImage{
      lazyImageObserver.observe(lazyImage);
    });
  }
});
</script>

为什么有效

  • 改进加载时间:减少初始加载的数据量,加快首次页面加载速度。
  • 更好的用户体验:仅在需要时加载图片,提升用户性能体验。

8. 使用Web Workers处理密集任务

Web Workers允许你在后台线程中运行JavaScript,与主执行线程分离。这非常适合处理CPU密集型任务而不阻塞UI。

// main.js
const worker = new Worker('worker.js');
worker.onmessage = function(e{
  console.log('Worker said: ', e.data);
};
worker.postMessage('Hello, Worker!');

// worker.js
self.onmessage = function(e{
  console.log('Main thread said: ', e.data);
  self.postMessage('Hello, Main thread!');
};

为什么有效

  • 提高响应速度:将重计算任务卸载到后台线程,保持UI响应速度。
  • 更好的性能:防止阻塞主线程,从而实现更流畅的交互。

9. 优化CSS和JavaScript的加载方式

你加载CSS和JavaScript的方式会影响页面的性能。异步加载这些资源或推迟加载可以改善页面加载时间。

<!-- 异步JavaScript -->
<script src="script.js" async></script>

<!-- 推迟JavaScript加载 -->
<script src="script.js" defer></script>

<!-- 异步CSS -->
<link rel="stylesheet" href="styles.css" media="none" onload="if(media!='all')media='all'">

为什么有效

  • 减少阻塞:防止CSS和JavaScript文件阻塞页面的渲染。
  • 更快的加载时间:允许其他资源并行加载,加快页面加载速度。

10. 避免使用eval()

eval()函数是JavaScript中一个强大但危险的功能。它允许你执行字符串形式的JavaScript代码,但也可能引入安全漏洞和性能问题。

替代方法

  • 使用 JSON.parse() 解析JSON数据。
  • 使用 new Function() 动态创建函数。

为什么有效

  • 提高安全性:降低注入攻击的风险。
  • 更好的性能:避免了将字符串作为代码执行带来的性能损耗。

11. 使用高效的数据结构

选择合适的数据结构可以显著影响JavaScript代码的性能。数组、对象、集合和映射都有不同的优劣势。

示例

  • 数组:用于有序集合。
  • 对象:用于键值对。
  • 集合:用于唯一值。
  • 映射:用于具有复杂键的键值对。

为什么有效

  • 提高效率:减少搜索、插入和删除操作的时间复杂度。
  • 更好的性能:优化内存使用,提升数据操作速度。

12. 对代码进行性能分析

对JavaScript代码进行性能分析可以帮助你识别性能瓶颈。Chrome DevTools和Firefox Developer Tools等工具提供了详细的代码执行洞察。

如何使用

  • Chrome DevTools:按下F12,转到“Performance”选项卡,点击“Record”开始性能分析。
  • Firefox Developer Tools:操作步骤

类似Chrome,提供“Performance”选项卡进行性能分析。

为什么有效

  • 识别瓶颈:帮助你找出缓慢的函数或内存泄漏。
  • 优化性能:提供可操作的洞察,以改进和优化代码。

13. 使用内容分发网络(CDN)

内容分发网络(CDN)是一组分布在全球各地的服务器网络。通过CDN提供你的JavaScript文件(和其他资源),你可以减少不同地理区域用户访问你网站的延迟。

<script src="https://cdn.example.com/library.min.js"></script>

为什么有效

  • 更快的加载时间:用户从地理位置更接近的服务器下载资源。
  • 减少服务器负载:将带宽消耗从你的服务器转移到CDN。

14. 优化图像和媒体

图像和媒体文件通常是网页上最大的资源,如果没有适当优化,它们会显著拖慢页面加载时间。使用工具压缩并为不同设备正确调整图像大小。

如何优化

  • 使用WebP格式:WebP相比JPEG和PNG提供了更好的压缩效果,而不会显著降低质量。
  • 响应式图像:根据用户的设备提供不同尺寸的图像,使用srcset属性。
    <img src="image-small.jpg" srcset="image-medium.jpg 768w, image-large.jpg 1200w" alt="Description">

为什么有效

  • 改进加载时间:较小的图像加载更快,提升整体页面性能。
  • 更好的用户体验:更快加载的媒体内容提升了用户体验,尤其是在移动设备上。

15. 为非关键资源实现延迟加载

延迟加载不仅适用于图像——它也可以应用于脚本、视频和其他媒体内容。通过仅在需要时加载非必要资源,你可以减少初始加载时间,并提升感知性能。

<script>
  document.addEventListener('DOMContentLoaded'function({
    const lazyScripts = document.querySelectorAll('script[data-lazy]');
    lazyScripts.forEach(function(script{
      const newScript = document.createElement('script');
      newScript.src = script.dataset.lazy;
      document.body.appendChild(newScript);
    });
  });
</script>

为什么有效

  • 更快的初始加载:推迟加载非必要的脚本和资源,加快页面的初始加载。
  • 增强的性能:通过优先加载关键内容,提升用户体验。

JavaScript是一门强大的语言,但如果不加以优化,它很容易成为瓶颈。通过应用这15个性能优化技巧,你可以确保你的JavaScript代码高效运行,从而加快加载时间,提升用户体验,并提高搜索引擎排名。

在2024年,随着网络应用程序变得越来越复杂,用户期望更快的加载时间,优化你的JavaScript不再只是一个选择——它是必需的。今天就开始将这些最佳实践纳入你的工作流程,看看你的应用程序将如何表现得更出色。

欲了解更多技巧,请查看JS Quick Tips。

最后:
CSS技巧与案例详解
vue2与vue3技巧合集
VueUse源码解读

JavaScript 每日一练
每天一道JavaScript 实战题,让大家平时多多积累实用的知识,提高开发效率,才有更多的时间摸鱼。
 最新文章