1. 资源加载优化
(1)减少HTTP请求
- 合并文件:将多个CSS/JS文件合并,减少请求次数。
- 使用CSS Sprites:将小图标合并成一张大图,减少图片请求。
- 内联关键CSS/JS:首屏关键代码直接内联到HTML,减少渲染阻塞。
(2)资源压缩
- 代码压缩:使用工具(如Terser、UglifyJS)压缩JS,CSSNano压缩CSS。
- 图片优化:
- 使用WebP代替JPEG/PNG(兼容性允许时)。
- 使用
<picture>
和srcset
适配不同分辨率。 - 工具压缩:TinyPNG、ImageOptim。
- Gzip/Brotli压缩:服务器启用压缩,减少传输体积。
(3)按需加载
- 懒加载(Lazy Load):图片、iframe等资源在进入视口时再加载。
- 代码分割(Code Splitting):
- Webpack的
SplitChunksPlugin
拆分公共代码。 - 动态导入(
import()
)实现按需加载组件。
- Webpack的
(4)预加载关键资源
<link rel="preload">
:提前加载关键CSS/字体/脚本。<link rel="prefetch">
:预加载后续页面可能需要的资源。<link rel="preconnect">
:提前建立DNS/TCP连接(如CDN、API域名)。
2. 渲染性能优化
(1)减少重排(Reflow)和重绘(Repaint)
- 使用
transform
和opacity
代替top/left
等属性(触发GPU加速)。 - 避免频繁操作DOM,使用
documentFragment
或虚拟DOM(如React/Vue)。 - 使用
will-change
提示浏览器哪些元素会变化。
(2)优化CSS
- 避免深层嵌套选择器(如
.nav ul li a
),影响渲染速度。 - 使用Flex/Grid布局,减少浮动和定位的使用。
- 减少
@import
(会阻塞渲染),改用<link>
加载CSS。
(3)优化JavaScript执行
- 减少主线程阻塞:
- 长任务拆分为小任务(使用
setTimeout
或requestIdleCallback
)。 - Web Worker处理复杂计算。
- 长任务拆分为小任务(使用
- 防抖(Debounce)和节流(Throttle):优化
scroll
、resize
等高频事件。 - **使用
requestAnimationFrame
**优化动画,避免setTimeout
抖动。
3. 缓存策略
(1)浏览器缓存
- 强缓存:
Cache-Control: max-age=31536000
(1年)。 - 协商缓存:
ETag
/Last-Modified
,减少重复下载。
(2)Service Worker
- 实现离线缓存(PWA),提升二次访问速度。
(3)CDN加速
- 静态资源(JS/CSS/图片)部署到CDN,减少网络延迟。
4. 其他优化
(1)减少第三方脚本
- 延迟加载分析工具(如Google Analytics)。
- 使用
async
或defer
加载非关键JS。
(2)SSR/SSG(服务端渲染/静态生成)
- Next.js/Nuxt.js等框架优化首屏加载。
(3)优化Web字体
- 使用
font-display: swap
避免字体加载时的空白期。 - 仅加载需要的字重(如
woff2
格式)。
总结
前端优化涉及多个方面,核心目标是减少加载时间、提升渲染效率、优化用户体验。可以通过工具(如Lighthouse、WebPageTest)检测性能瓶颈,并持续优化。