其他优化
避免浏览器解析阻塞
当主线程正在执行 JavaScript 脚本文件时,渲染线程是停止工作的,所以 JavaScript 会影响页面加载首屏的速度。
当页面构建 DOM 和 CSSOM 树时,如果给 JavaScript 脚本添加上 defer 或者 async 属性,就能够有效解决这种问题。
减少不必要的 DOM 操作
每次操作 DOM 都是一次性能开销,它意味着需要修改 DOM 树,还有可能触发浏览器的回流和重绘。
如果巧用 DOMFragment 或者数组方式减少 DOM 操作开销,就可以提高浏览器渲染的速度。
用宏/微任务异步执行
浏览器采用事件循环来管理同步、异步代码。
简单来说,浏览器就是在内部有两个队列,宏任务队列和微任务队列,其中微任务队列是在宏任务开启后生成的,并非独立于宏任务的队列。
- 宏任务队列的第一个任务是 script 脚本,
- 在执行宏任务时会往内部的微任务队列中塞微任务(queueMicrotask、promise.then)等,当微任务队列里的所有任务都执行完,就会触发 UI 线程的 render 行为。
- 继续往宏任务队列中塞宏任务,比如 setTimeout 或者用户的点击事件、XHR 等,继续第 2 步..
- 整个过程循环往复进行...
根据这个特点,我们可以将某些费时的任务放在异步完成,这样就能减轻浏览器单线程执行代码的压力,好处是页面执行速度变快了,减少页面卡顿。