JavaScript 性能优化实战大纲
核心优化方向
减少主线程阻塞
- 避免长任务(Long Tasks)拆分计算密集型操作
- 使用 Web Workers 处理后台任务
- 优先使用
requestIdleCallback
或requestAnimationFrame
内存管理
- 避免内存泄漏(如未清理的定时器、闭包引用)
- 使用弱引用(
WeakMap
/WeakSet
)管理临时数据 - 监控内存使用(Chrome DevTools Memory 面板)
代码层优化
高效数据操作
- 减少不必要的深度对象拷贝,优先使用
Object.assign
或展开运算符 - 数组处理优先使用
for
循环而非高阶函数(大数据场景) - 使用 TypedArray 处理二进制数据
DOM 操作优化
- 批量 DOM 更新(文档片段
DocumentFragment
) - 避免强制同步布局(如分离读写操作)
- 使用
will-change
提示浏览器优化渲染
网络与加载优化
资源加载策略
- 异步加载非关键脚本(
async
/defer
) - 代码拆分(Dynamic Import)按需加载模块
- 预加载关键资源(
<link rel="preload">
)
缓存机制
- 合理配置 HTTP 缓存头(
Cache-Control
/ETag
) - Service Worker 实现离线缓存
- 利用 IndexedDB 存储结构化数据
工具与监控
性能分析工具
- Lighthouse 生成优化建议
- Chrome DevTools Performance 面板定位瓶颈
- 使用
console.time
/performance.now
测量关键路径
持续监控
- 注入 RUM(Real User Monitoring)脚本收集性能指标
- 关注 FCP、LCP、TTI 等核心 Web Vitals
- 异常监控(如 Sentry)捕获运行时性能问题
进阶场景
框架级优化
- React 中避免不必要的重新渲染(
React.memo
/useMemo
) - Vue 的
v-once
和v-memo
指令优化静态内容 - 虚拟列表(Virtual Scrolling)处理大数据渲染
V8 引擎优化技巧
- 保持函数单一化(利于 V8 内联优化)
- 避免隐藏类(Hidden Class)破坏(如动态添加属性)
- 使用
Array.prototype.sort
的稳定排序优化