如何优化 Next.js 应用的生产环境性能

在将 Next.js 应用部署至生产环境之前,您应当考虑实施一些优化措施和模式,以获得最佳的用户体验、性能和安全性。

本页提供了最佳实践指南,可作为应用开发阶段上线前准备的参考,同时也介绍了您应当了解的Next.js自动优化机制

自动优化

以下 Next.js 优化功能默认启用且无需配置:

这些默认优化旨在提升应用性能,减少每次网络请求传输的数据量和成本。

开发阶段优化

在构建应用时,我们推荐使用以下功能来确保最佳性能和用户体验:

路由与渲染

须知: 部分预渲染 (Partial Prerendering)(实验性功能)将允许路由部分保持动态,而无需整个路由进入动态渲染模式。

数据获取与缓存

  • 服务端组件: 充分利用服务端组件在服务器端获取数据的优势。
  • 路由处理器 (Route Handlers): 通过路由处理器从客户端组件访问后端资源,但避免在服务端组件中调用路由处理器以防止额外的服务器请求。
  • 流式传输 (Streaming): 使用加载UI和React Suspense逐步从服务器向客户端发送UI,防止数据获取时阻塞整个路由。
  • 并行数据获取: 通过并行获取数据减少网络瀑布流。在适当时也可考虑预加载数据
  • 数据缓存: 验证数据请求是否被缓存,并在适当时启用缓存。确保未使用fetch的请求也能被缓存
  • 静态资源: 使用public目录自动缓存应用的静态资源(如图片)。

UI与无障碍访问

  • 表单与验证: 使用服务端操作 (Server Actions) 处理表单提交、服务端验证和错误处理。
  • 字体模块: 通过字体模块优化字体,自动托管字体文件与其他静态资源,消除外部网络请求,减少布局偏移 (layout shift)
  • <Image>组件: 使用图片组件自动优化图片,防止布局偏移,并以WebP等现代格式提供。
  • <Script>组件: 使用脚本组件优化第三方脚本,自动延迟加载并防止阻塞主线程。
  • ESLint: 使用内置的eslint-plugin-jsx-a11y插件及早发现无障碍访问问题。

安全性

元数据与SEO

类型安全

  • TypeScript 和 TS插件: 使用TypeScript及其插件获得更好的类型安全,及早发现错误。

上线前准备

在上线前,您可以运行next build在本地构建应用并捕获构建错误,然后运行next start测量应用在生产环境下的性能表现。

核心网页指标

  • Lighthouse: 在隐身模式下运行Lighthouse,更好地理解用户体验并发现改进点。这是模拟测试,应与实际数据(如核心网页指标)结合分析。

包分析

使用@next/bundle-analyzer插件分析JavaScript包大小,识别可能影响性能的大型模块和依赖项。

以下工具可帮助您了解添加新依赖对应用的影响: