Next.js 部署、自托管与 standalone
Next.js 的部署方式不只是“上 Vercel 就行”这么一句话。
按现在这代文档的说法,部署路线大致可以分成四类:
- Node.js server
- Docker / standalone
- Static export
- Adapters
不同路线的能力边界差别很大,尤其会影响:
- SSR
- Route Handlers
- Server Actions
- 图片优化
- 缓存和 ISR
- 元信息文件和动态路由
先看最稳的一条线:Node.js server
{
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start"
}
}
这是最完整、最少惊喜的一条线。
适合:
- 需要完整 Next 能力
- 有 SSR、Route Handlers、Server Actions
- 自己控制 Node 运行环境
官方文档也明确写了:Node.js server 部署支持全部 Next.js 特性。
自托管时官方最强调什么
比较重要的一点是:自托管时最好在 Next 服务前面加反向代理,例如 nginx。
原因不是形式问题,而是它能承担:
- 异常请求过滤
- 慢连接攻击缓冲
- 负载和连接限制
- 一部分缓存与静态资源策略
也就是说,Next 服务更适合专注于渲染和应用逻辑,不适合裸露在最外层承担所有网络边界责任。
output: 'standalone' 是什么
这是很多团队在 Docker 和自托管场景里最常用的一项配置。
import type { NextConfig } from 'next';
const nextConfig: NextConfig = {
output: 'standalone',
};
export default nextConfig;
它依赖 Output File Tracing,把运行生产版本真正需要的文件收出来,生成一个更轻的 .next/standalone 目录。
官方文档里提到几个关键点:
.next/standalone会带上最小运行所需文件- 同时会生成一个最小
server.js public和.next/static默认不会自动复制到 standalone 目录- 如果需要由这个最小 server 直接服务静态资源,可以手工复制进去
standalone 适合什么场景
很适合:
- Docker 镜像瘦身
- 自托管平台
- 需要把运行时依赖尽量收窄
不代表:
- 完全不需要理解 Node 运行环境
- 完全不需要理解静态资源和图片优化如何交付
Docker 场景怎么理解
比较常见的思路是:
- 构建阶段执行
next build - 运行阶段只拷贝
.next/standalone、.next/static、public - 用最小 Node 镜像起
server.js
这样做的价值主要在于:
- 镜像更小
- 依赖更少
- 部署产物边界更清楚
Static export 的边界
如果配置:
const nextConfig = {
output: 'export',
};
那整个项目会被导成静态文件。
这条线适合:
- 纯静态文档站
- 纯营销页
- 完全不需要服务端能力的内容站
但官方文档也讲得很清楚,这条线是有能力上限的。只要项目依赖:
- SSR
- Route Handlers
- Server Actions
- 动态服务端逻辑
就不适合把它当默认部署方案。