一、提升项目启动速度(开发环境 + 生产环境)
1. 开发环境启动速度优化
- 构建工具选择与配置 :
- 用
Vite
替代Webpack
(基于 ES 模块原生支持,无需预打包,冷启动速度提升 10-100 倍)。 - 若用 Webpack,优化配置:
- 缩小
loader
作用范围(如include: path.resolve('src')
避免遍历 node_modules)。 - 启用
cache-loader
或hard-source-webpack-plugin
缓存编译结果。 - 拆分配置(开发 / 生产环境分离),开发环境禁用代码压缩、Tree-shaking 等耗时操作。
- 缩小
- 用
- 依赖优化 :
- 用
pnpm
替代npm/yarn
(硬链接 + 符号链接,节省磁盘空间且安装更快)。 - 对大型依赖(如
lodash
)采用按需导入(import { debounce } from 'lodash-es'
)。 - 非核心依赖用
externals
排除(如通过 CDN 引入echarts
,不参与本地打包)。
- 用
2. 生产环境启动(首屏加载)速度优化
- 资源体积削减 :
- 代码层面:启用 Tree-shaking(清除未使用代码)、Scope Hoisting(减少函数声明开销)。
- 静态资源:
- 图片:使用 WebP/AVIF 格式(比 JPG 小 30%+),通过
srcset
适配不同设备分辨率,非首屏图片懒加载(loading="lazy"
或 IntersectionObserver)。 - CSS/JS:压缩(
terser-webpack-plugin
/css-minimizer-webpack-plugin
)、开启 Gzip/Brotli 压缩(需服务器配合)。
- 图片:使用 WebP/AVIF 格式(比 JPG 小 30%+),通过
- 加载策略优化 :
- 路由懒加载(
React.lazy
/Vue 异步组件),首屏只加载必要代码。 - 关键资源优先加载:CSS 内联到 HTML(避免额外请求),JS 用
async
/defer
异步加载(不阻塞 HTML 解析)。 - 预加载关键资源:
<link rel="preload" href="critical.js" as="script">
。
- 路由懒加载(
- CDN 与缓存策略 :
- 静态资源(JS/CSS/ 图片)部署到 CDN,利用边缘节点加速。
- 合理设置缓存:强缓存(
Cache-Control: max-age=31536000
)用于不变资源(如第三方库),协商缓存(ETag/Last-Modified
)用于频繁更新资源。
二、优化内存占用(运行时性能)
内存占用过高会导致页面卡顿、崩溃,核心是减少不必要的内存消耗和避免内存泄漏。
- 避免内存泄漏 :
- 清理事件监听:移除组件时解绑
addEventListener
事件(如window.scroll
、resize
)。 - 销毁定时器:
setInterval
/setTimeout
在组件卸载前用clearInterval
/clearTimeout
清除。 - 释放 DOM 引用:避免闭包中留存已删除的 DOM 节点(如
const el = document.getElementById('xxx');
组件销毁后需置为null
)。 - 检测工具:用 Chrome DevTools 的「Memory」面板,通过「Heap Snapshot」对比内存快照,查找未释放的对象(如 detached DOM 节点)。
- 清理事件监听:移除组件时解绑
- 优化数据处理 :
- 长列表虚拟滚动:用
react-virtualized
/vue-virtual-scroller
,只渲染可视区域内的 DOM(避免 1000+ 条数据一次性渲染)。 - 大数据分片处理:用
requestIdleCallback
分批处理数据(避免单条同步任务阻塞主线程)。 - 减少不必要的缓存:对大体积数据(如 10MB+ 的 JSON),避免长期存在于内存中,按需加载并及时释放。
- 长列表虚拟滚动:用
三、增强流畅度(减少卡顿,提升交互体验)
流畅度核心是保证帧率稳定(60fps,即每帧耗时 < 16ms),避免主线程阻塞。
- 减少重绘(Repaint)和重排(Reflow) :
- 批量操作 DOM:先将 DOM 脱离文档流(如
display: none
),修改后再插入,或用DocumentFragment
批量添加节点。 - 避免频繁读取布局属性:
offsetTop
/getBoundingClientRect
等会触发强制同步布局,建议缓存结果(如const top = el.offsetTop;
多次使用)。 - 用 CSS 硬件加速:对动画元素用
transform
/opacity
(仅触发合成层,不重排重绘),避免left
/top
等属性。
- 批量操作 DOM:先将 DOM 脱离文档流(如
- 优化 JavaScript 执行效率 :
- 拆分长任务:将耗时操作(如复杂计算、大数据过滤)用
setTimeout
或Web Workers
拆分到后台线程(避免主线程阻塞)。 - 防抖节流:对高频事件(
scroll
/resize
/input
)用防抖(debounce
)或节流(throttle
)限制执行频率。 - 避免过度使用闭包:闭包会保留父作用域的变量,增加内存占用,必要时用局部变量替代。
- 拆分长任务:将耗时操作(如复杂计算、大数据过滤)用
- 优化动画与交互 :
- 用
requestAnimationFrame
处理动画(确保与浏览器刷新同步),替代setTimeout
。 - 减少 DOM 数量:复杂组件(如表格、表单)用虚拟 DOM 框架(React/Vue)的 diff 算法优化更新,或用 Canvas/SVG 替代大量 DOM 元素。
- 用
四、解决浏览器兼容问题
需兼顾不同浏览器(如 Chrome、Safari、Edge、IE)和设备(PC / 移动端)的特性差异,核心是 "渐进式增强" 和 "优雅降级"。
- 语法与 API 兼容 :
- 转译 ES6+ 语法:用
Babel
配合@babel/preset-env
将高级语法转为 ES5(需配置targets
指定兼容的浏览器版本)。 - 补充缺失 API:用
core-js
/regenerator-runtime
提供Promise
/Array.prototype.includes
等 polyfill(通过useBuiltIns: 'usage'
自动按需导入)。 - 处理 CSS 兼容:用
postcss
+autoprefixer
自动添加浏览器前缀(如-webkit-
/-moz-),配合
browserslist` 配置兼容范围。
- 转译 ES6+ 语法:用
- 特性检测与适配 :
- 用
Modernizr
检测浏览器特性(如flexbox
/webp
支持),针对性提供降级方案(如不支持flex
时用float
替代)。 - 移动端兼容:
- 处理 300ms 点击延迟:用
FastClick
或<meta name="viewport" content="width=device-width">
解决。 - 适配不同分辨率:用
rem
/vw
做响应式布局,避免固定像素(px
)。
- 处理 300ms 点击延迟:用
- 低版本浏览器(如 IE11):
- 避免使用 ES6+ 新增对象(如
Map
/Set
),或用core-js
polyfill。 - 不支持 CSS Grid 时,用 Flexbox 或传统布局替代。
- 避免使用 ES6+ 新增对象(如
- 用
- 测试与工具 :
- 用
BrowserStack
或Sauce Labs
跨浏览器测试(覆盖主流版本和设备)。 - 接入 CI 流程:用
ESLint
检测潜在兼容问题,PostCSS
自动处理 CSS 兼容。
- 用
总结
前端优化是系统性工作,需结合「构建工具优化」「代码层面优化」「资源策略优化」「监控与迭代」四个环节:
- 用 Lighthouse 或 WebPageTest 定期检测性能瓶颈(量化指标:FCP、LCP、CLS 等)。
- 优先解决影响用户体验的核心问题(如首屏加载慢、交互卡顿)。
- 兼容问题需在开发初期明确范围(如是否支持 IE),避免后期返工。