部署
Next.js 可以用多种方式部署:托管平台(Vercel、Netlify、Cloudflare…)、自建 Node.js 服务器、Docker、静态导出,甚至通过 Adapter 对接其它运行时。本章概览这些路径,帮你在生产环境做出合适选择。
构建产物
pnpm build # next build
pnpm start # next start
next build 会输出:
.next/server/—— 服务端渲染代码、Server Components、Route Handlers。.next/static/—— 客户端 JS、CSS、静态资源(带内容哈希,长缓存安全)。.next/standalone/(可选) —— 只包含运行所需的最小 Node 代码 +node_modules。
next start 以生产模式启动 Node.js 服务。
一、托管到 Vercel 等平台
Next.js 的 “zero-config” 部署体验最完整的就是 Vercel。你只需把仓库连上去,平台会自动识别:
- Server Components / SSR / ISR
- Partial Prerendering(PPR)
- Image Optimization
- Middleware / Edge Runtime
- Cron Jobs、Skew Protection 等
Netlify、Cloudflare Pages、AWS Amplify 等通过各自的 Adapter 也提供近似能力。
二、自建 Node.js 服务器
只要运行环境支持 Node.js 20.9+,就可以直接用 next start:
node_modules/.bin/next start -p 3000
常见部署做法:
- CI 中执行
pnpm install --prod=false && pnpm build。 - 把
.next/、public/、package.json、node_modules(或standalone)拷贝到服务器。 - 用 PM2 / systemd / supervisor 守护进程。
- 前面放 Nginx / Caddy 做 TLS、gzip、静态资源缓存。
Standalone 输出
在 next.config.js 开启:
module.exports = { output: 'standalone' };
构建后复制 .next/standalone + .next/static + public,启动:
node .next/standalone/server.js
镜像体积会小非常多,非常适合容器化部署。
三、Docker 部署
基于 output: 'standalone' 的典型多阶段 Dockerfile:
FROM node:20-alpine AS deps
WORKDIR /app
COPY package.json pnpm-lock.yaml ./
RUN corepack enable && pnpm install --frozen-lockfile
FROM node:20-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN corepack enable && pnpm build
FROM node:20-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
COPY --from=builder /app/public ./public
COPY --from=builder /app/.next/standalone ./
COPY --from=builder /app/.next/static ./.next/static
EXPOSE 3000
CMD ["node", "server.js"]
四、静态导出
如果站点完全静态(无 Server Action、无 SSR),可以直接导出成静态文件:
// next.config.js
module.exports = { output: 'export' };
产物在 out/,可托管到任意静态服务器(Nginx、CDN、GitHub Pages)。注意:
- 不能用 Server Actions、Route Handlers 的动态 API、
next/image默认优化等。 - 可以用
next/image的unoptimized模式或第三方 loader。
五、Adapter:面向其它运行时
Next.js 通过 Adapter 支持 Cloudflare Workers、Netlify Edge、Deno 等:
@opennextjs/cloudflare@netlify/next@vercel/next(官方)
在 next.config.js 里配置对应 Adapter,再按平台文档部署即可。Adapter 会负责把构建产物转成运行时可执行的格式。
生产环境的几个“要点”
- 设置环境变量:数据库、第三方密钥通过平台环境变量注入;本地用
.env.local,不要提交。 - 缓存策略:
.next/static/长缓存(immutable),页面响应结合cacheLife/revalidateTag管理。 - 镜像安全:多阶段构建,
runner阶段用非 root 用户。 - 观测:启用
instrumentation.ts、接入 OpenTelemetry / Sentry / Datadog。 - Skew Protection:长时间用户仍能访问旧版本资源;在 Vercel 自动启用,自托管可用
deploymentId实现。
跟 Nuxt 比较
- Nuxt 用 Nitro,一键生成 Node / Cloudflare / Lambda 等 preset。
- Next.js 的 Adapter 方向接近 Nitro preset,只是需要额外适配包。
选择部署方式前,先确认以下三件事:
- 是否需要 SSR / Server Actions;
- 是否需要细粒度缓存与边缘能力;
- 运维成本(托管 vs 自建)能承受到什么程度。
匹配好这三点,再从上面任选一条路径上线即可。