如何自托管 Next.js 应用程序
在部署你的 Next.js 应用时,你可能希望根据你的基础设施配置不同功能的处理方式。
🎥 观看: 了解更多关于自托管 Next.js 的信息 → YouTube (45 分钟)。
图像优化
通过 next/image 进行的图像优化在使用 next start 部署时无需配置即可自托管工作。如果你希望有单独的服务来优化图像,你可以配置图像加载器。
图像优化可以通过在 next.config.js 中定义自定义图像加载器与静态导出一起使用。请注意,图像在运行时优化,而不是在构建期 间。
需要了解:
中间件
中间件在使用 next start 部署时无需配置即可自托管工作。由于它需要访问传入请求,因此在使用静态导出时不支持。
中间件使用Edge 运行时,这是所有可用 Node.js API 的子集,有助于确保低延迟,因为它可能在你的应用程序中的每个路由或资产前面运行。如果你不想要这个,你可以使用完整的 Node.js 运行时来运行中间件。
如果你希望添加需要所有 Node.js API 的逻辑(或使用外部包),你可能能够将此逻辑移动到布局作为服务器组件。例如,检查headers和重定向。你也可以使用 headers、cookies 或查询参数通过 next.config.js 进行重定向或重写。如果这不起作用,你也可以使用自定义服务器。
环境变量
Next.js 可以支持构建时和运行时环境变量。
默认情况下,环境变量仅在服务器上可用。要将环境变量暴露给浏览器,它必须以 NEXT_PUBLIC_ 为前缀。但是,这些公共环境变量将在 next build 期间内联到 JavaScript 包中。
要读取运行时环境变量,我们建议使用 getServerSideProps 或逐步采用 App Router。
这允许你使用一个单一的 Docker 镜像,可以通过具有不同值的多个环境进行推广。
需要了解:
- 你可以使用
register函数在服务器启动时运行代码。- 我们不建议使用 runtimeConfig 选项,因为这不适用于独立输出模式。相反,我们建议逐步采用 App Router。
缓存和 ISR
Next.js 可以缓存响应、生成的静态页面、构建输出以及其他静态资产,如图像、字体和脚本。
缓存和重新验证页面(使用增量静态再生)使用相同的共享缓存。默认情况下,此缓存存储在你的 Next.js 服务器的文件系统(磁盘)上。这在自托管时自动工作,使用 Pages 和 App Router。
如果你希望将缓存的页面和数据持久化到持久存储,或在多个容器或 Next.js 应用程序实例之间共享缓存,你可以配置 Next.js 缓存位置。
自动缓存
- Next.js 为真正不可变的资产设置
Cache-Control头为public, max-age=31536000, immutable。它不能被覆盖。这些不可变文件在文件名中包含 SHA 哈希,因此可以安全地无限期缓存。例如,静态图像导入。你可以为图像配置 TTL。 - 增量静态再生 (ISR) 设置
Cache-Control头为s-maxage: <revalidate in getStaticProps>, stale-while-revalidate。此重新验证时间在你的getStaticProps函数中以秒为单位定义。如果你设置revalidate: false,它将默认为一年的缓存持续时间。 - 动态渲染的页面设置
Cache-Control头为private, no-cache, no-store, max-age=0, must-revalidate以防止用户特定数据被缓存。这适用于 App Router 和 Pages Router。这也包括