加载阶段(使用Network查看)
- 减少http请求次数
CSS Sprites、数据缓存 - 减小http请求内容大小
JS/CSS源码压缩、网页gzip、压缩图片 - 加快请求速度
CDN托管、图片服务器 - 通过域名切分突破同域并发请求数为6的限制
- 延迟加载
JS的defer、async、动态创建script标签、按需import()
图片/DOM元素懒加载 - 预加载
- 流式解析
对于超大请求,使用 Fetch API 的ReadableStream
处理流式响应,分块读取。 - 其他
CSS写顶部(让CSS尽快开始下载/解析)
JS写底部(避免阻塞HTML和CSS解析)
避免使用table和iframe(他们要等其中的内容完全下载之后才会显示出来,比div+css布局慢。iframe还会阻塞页面的onload,因此最好事后用js操作其src)
交互阶段(使用Performance查看火焰图)
- 减少JS执行时间,防止太久占用主线程(拆分函数、启用Web Worker)
- 避免频繁触发回流/重绘
不要频繁查询位置信息
合理利用复合图层(transform动画)
使用虚拟DOM - 不要在循环中大量创建临时对象/方法,避免频繁的垃圾回收
- 使用
requestAnimationFrame
代替setTimeout
:
在不可见的页面中会自动暂停,且不会因主线程阻塞导致多个回调堆积,恢复时突然执行造成卡顿。 - Vue:合理使用
v-once
/v-memo
-
函数节流(throttle)
在事件触发后加入队列,n秒后统一处理。如果期间又有事件发生,则重新计时。
用于搜索框搜索联想等。 -
函数防抖(debounce)
事件在限定时间内多次触发也只结算一次。
用于邮箱输入格式验证、搜索框最后一次输入完,再发送请求等。 - 做好内存管理
及时销毁不再需要的对象、避免内存泄漏(闭包、销毁事件侦听器)。