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

82 阅读3分钟

JS性能优化与调试技巧

JavaScript作为一门广泛使用的前端语言,JavaScript代码的性能也会影响到用户体验和页面加载速度,本文主要探讨如何通过优化JavaScript代码来提高性能,包括减少重绘和重排、使用节流和防抖技术、使用性能分析工具等。

减少重绘和重排

重绘(repaint)和重排(reflow)是浏览器渲染页面的两个过程。

  • 重绘是指当元素的外观发生变化,浏览器重新绘制元素的过程。例如,改变元素的颜色、背景、边框等。
  • 重排也叫做回流,就是重新排列的意思,只要改变了元素的位置和尺寸大小,浏览器就需要重新计算元素的位置,重新构造渲染DOM,这就叫重排。

可以通过以下两种方法减少重排和重绘。

  1. 不在布局信息改变时做dom查询。
  2. 减少直接操作dom元素,批量修改dom,可以合并多次对dom和样式的修改。
var box = document.getElementById('box');
box.style.padding = '6px';
box.style.borderLeft = '2px';
box.style.borderRight = '2px';

在上述例子中,需要对三个属性进行修改,在不同的浏览器中,有可能会导致三次重排。这时就可以采取如下的方式进行处理:

var box = document.getElementById('box');
box.style.cssText'border-left: 2px; border-right: 2px; padding: 6px;';
  1. 不要使用table布局,table属性变化使用会直接导致布局重排或者重绘。
  2. 对于多次重排的元素,比如复杂动画,使用绝对定位脱离文档流,不影响其他元素。即当dom元素position属性为fixed或者absolute, 可以通过css形变触发动画效果。

使用节流和防抖技术

  • 节流(Throttling)就是控制流量,单位时间内事件只能触发一次。

节流的实现主要有两种主流方式:一种是使用时间戳,特点是第一次事件会立刻执行,停止触发后没有办法再执行事件。一种是设置定时器,会在 n 秒后第一次执行,事件停止触发后依然会再执行一次事件。

  • 防抖(Debouncing)是防止抖动,单位时间内事件触发会被重置,避免事件被触发多次。其原理就是等触发完事件n秒内不再触发事件,才会执行。
function debounce(fun, wait) {
    var timeout;
    return function () {
        var context = this;
        var args = arguments;
        clearTimeout(timeout);
        timeout = setTimeout(function () {
            fun.apply(context, args)
        }, wait);
    }
}

使用性能分析工具

  1. 可以使用Chrome开发者工具,Chrome是很智能的,只要页面开始载入就会开始纪录。 image.png 可以在Network模块中查看网络资源请求情况,在Performance里面进行性能分析,查看页面各项性能指标情况,在Memory中查看页面内存情况,另外性能分析器(JavaScript Profiler)也是Chrome开发者工具的一部分,可以记录函数的耗时情况,方便找出耗时较多的函数。
  2. WebPageTest:WebPageTest是一款免费的在线性能分析工具,可以帮助我们测试网站在不同网络条件下的加载速度、渲染速度、响应时间等。 image.png
  3. Lighthouse:Lighthouse是一个开源的自动化工具,用于改进网络应用的质量。可以对某个要查询的网址页面进行测试,然后生成一个包含各方面性能的报告。

总结

要想提高网页的性能和用户的体验,优化Javascript性能问题是非常重要的。可以通过一些js代码优化的技巧来提高网页的技能,比如最小化代码、减少dom查询等。另外,借助一下工具可可以帮助我们分析性能问题,找到问题并解决,可以很大程度上提高网站和应用的实际性能。