性能优化与调试技巧 | 青训营

68 阅读2分钟
  1. 减少重绘和重排:

    • 使用CSS合并和压缩,减少HTTP请求和文件大小。
    • 避免使用不必要的DOM操作,减少DOM的重新渲染。
    • 使用requestAnimationFrame调度动画更新,让浏览器在下一帧绘制之前对页面进行优化。
    • 使用transformopacity等CSS属性进行动画,以避免重排和重绘。 使用CSS合并和压缩:
<link rel="stylesheet" href="styles.css">

使用requestAnimationFrame

function animate() {
  // 执行动画的代码
  
  requestAnimationFrame(animate); // 调用requestAnimationFrame来进入下一帧动画更新
}

requestAnimationFrame(animate); // 启动动画函数

使用transformopacity等CSS属性进行动画:

// 操作DOM
const element = document.getElementById('myElement');
element.style.transform = 'translateX(100px)';
element.style.opacity = '0.5';

// 优化后的代码
const element = document.getElementById('myElement');
element.classList.add('animate'); // 使用CSS类名进行动画的修改
  1. 使用节流和防抖技术:

    • 节流(Throttling):限制事件触发的频率,例如在页面滚动事件处理中,可以使用节流来减少事件的触发次数。

    • 防抖(Debouncing):将多个连续的事件合并成一个,只触发一次。例如在输入框输入时,可以使用防抖来减少频繁的事件处理。 节流(Throttling):

    • 定时器节流:

    // 函数节流
    function throttle(func, delay) {
      let timer = null;
      
      return function() {
        if (!timer) {
          timer = setTimeout(() => {
            func.apply(this, arguments);
            timer = null;
          }, delay);
        }
      };
    }
    
    // 使用节流处理滚动事件
    window.addEventListener('scroll', throttle(function() {
      // 处理滚动事件的代码
    }, 200));
    
    • 时间戳节流:
    // 函数节流
    function throttle(func, delay) {
      let prevTime = 0;
      
      return function() {
        const currentTime = Date.now();
        if (currentTime - prevTime > delay) {
          func.apply(this, arguments);
          prevTime = currentTime;
        }
      };
    }
    
    // 使用节流处理滚动事件
    window.addEventListener('scroll', throttle(function() {
      // 处理滚动事件的代码
    }, 200));
    

防抖(Debouncing):

-   定时器防抖:

```
// 函数防抖
function debounce(func, delay) {
  let timer = null;

  return function() {
    clearTimeout(timer);
    timer = setTimeout(() => {
      func.apply(this, arguments);
    }, delay);
  };
}

// 使用防抖处理输入框输入事件
const inputElement = document.getElementById('myInput');
inputElement.addEventListener('input', debounce(function() {
  // 处理输入事件的代码
}, 300));
```

3. 使用性能分析工具:

使用Chrome开发者工具的Performance面板进行性能分析,可以查看函数的耗时、内存使用情况等。 使用Webpack的性能分析工具,可以分析打包后的文件大小,查找优化的潜在点。 使用Lighthouse等工具进行页面性能评估,并提供相应的优化建议。 使用Chrome开发者工具的Performance面板:

在Chrome DevTools中打开Performance面板。 点击录制按钮开始记录性能数据。 执行你要评估的操作(如滚动、点击等)。 停止录制并分析性能数据,查看事件时间线、函数耗时、内存使用等信息。

使用Webpack的性能分析插件:

安装Webpack Bundle Analyzer插件:`npm install --save-dev webpack

  1. 优化JavaScript代码:

减少全局变量的使用,将变量声明在局部作用域中,减少作用域链的查找。 尽量减少使用evalwith等低性能的语法。 将重复执行的计算结果缓存起来,避免重复计算。 使用事件委托,将事件处理函数绑定到父元素上,减少事件处理函数的数量。