下面整理一份 Next.js 应用性能变慢的常见 8 个原因及对应解决方案,涵盖 SSR、CSR、静态生成、API、前端资源等,适合中大型项目优化参考。
🔥 Next.js 应用变慢的 8 个原因及解决办法
1️⃣ SSR 渲染阻塞
原因:
- 每次请求都需要服务端渲染页面
- SSR 中的 API 请求、数据库查询过慢
解决办法:
- 对可静态化页面使用 getStaticProps / getStaticPaths
- 使用 ISR(Incremental Static Regeneration) 缓存静态页面
- 优化服务端 API、数据库查询
- 使用 缓存层(Redis、Varnish 等)
2️⃣ 客户端 JS 包过大
原因:
- 引入大型依赖(如 lodash、moment、chart.js)
- 页面未拆分 bundle,导致首屏加载慢
解决办法:
- 动态 import 按需加载组件:
const Chart = dynamic(() => import('chart.js')) - 使用 next/dynamic 延迟加载
- 使用 webpack 分包策略(拆分大库)
- 优化依赖:moment → dayjs,lodash → lodash-es
3️⃣ 图片资源未优化
原因:
- 使用原始大图,未压缩
- 未使用 Next.js Image 组件
解决办法:
- 使用 next/image 组件,自动优化
- 对图片进行 WebP/AVIF 格式压缩
- 开启 lazy loading(
loading="lazy")
4️⃣ 不必要的 re-render
原因:
- React 组件频繁更新
- Context / Redux / Zustand 状态变化导致整树重渲染
解决办法:
- 使用 React.memo 或 useMemo / useCallback 缓存组件和函数
- 优化状态管理,只更新必要组件
- 拆分大组件,减少渲染范围
5️⃣ API 请求过多 / 未缓存
原因:
- 页面在 SSR 或客户端频繁请求 API
- 请求重复,响应慢
解决办法:
- 缓存请求结果(SWR / React Query / Apollo Cache)
- 合并或批量请求
- 对 SSR API 添加 缓存头
6️⃣ Webpack / 构建体积过大
原因:
- 不必要的 polyfill
- 未 Tree Shaking
- CSS / JS 打包未优化
解决办法:
- Next.js 默认开启 Tree Shaking
- 使用 next/script 按需加载第三方脚本
- CSS 使用 Module CSS / Tailwind,减少全局样式
- 开启 Bundle Analyzer 检查大包
npm run analyze
7️⃣ SSR / ISR 缓存策略不合理
原因:
- SSR 页面每次都重新生成,导致慢
- ISR 重建时间过长
解决办法:
- 设置合适的 revalidate 时间
- 对热门页面使用 静态生成 + ISR
- 对非关键页面采用 CSR 渲染
8️⃣ CDN / 网络延迟
原因:
- 静态资源未通过 CDN 分发
- API 服务器延迟高
解决办法:
- 部署 Vercel / Netlify / CloudFront 等 CDN
- 静态资源放在 CDN
- API 加速,减少跨区域延迟
⚡ 额外优化技巧
- 使用 Lighthouse 或 WebPageTest 检测瓶颈
- 开启 gzip / brotli 压缩
- 使用 HTTP/2 或 HTTP/3 加速资源加载
- 开启 Next.js 自动静态优化
🔥 总结
| 问题类别 | 优化方式 |
|---|---|
| SSR 阻塞 | ISR / 静态生成 / 缓存 API |
| JS 包过大 | 动态 import / bundle 分割 / 精简依赖 |
| 图片资源 | next/image / WebP / lazy loading |
| 频繁 re-render | React.memo / useMemo / 状态拆分 |
| API 请求慢 | SWR / React Query / 缓存 / 合并请求 |
| 构建体积大 | Tree Shaking / next/script / 分析大包 |
| 缓存策略不合理 | ISR revalidate / 静态 + CSR 混合 |
| CDN / 网络慢 | CDN + 静态资源分发 + API 加速 |
发表回复