部署
得益于 Nitro,同一份代码可以部署到裸机 Node 服务器、Serverless、Edge 运行时或纯静态托管 —— 通常只要换个 preset 就行。
构建产物
pnpm build 会生成两个目录:
.output/
├── server/ # 入口 + 面向 Serverless 的服务端代码
└── public/ # 静态资源与预渲染 HTML
pnpm preview 起一个本地等价于生产的服务器。
纯静态托管用 pnpm generate,它会预渲染所有可达路由,只输出 .output/public/。
Node.js 服务器(默认 preset)
适合 VPS / Docker / 传统 PaaS:
node .output/server/index.mjs
# 监听 http://0.0.0.0:3000
支持的环境变量:
NITRO_PORT/PORT(默认3000)NITRO_HOST/HOST(默认0.0.0.0)NITRO_SSL_CERT/NITRO_SSL_KEY—— 开发用 HTTPS
进程管理(PM2)
// ecosystem.config.cjs
module.exports = {
apps: [{
name: 'my-nuxt-app',
port: '3000',
exec_mode: 'cluster',
instances: 'max',
script: './.output/server/index.mjs',
}],
}
pm2 start ecosystem.config.cjs 就开启多核集群模式。
Docker
一份最小多阶段镜像:
FROM node:22-alpine AS build
WORKDIR /app
COPY . .
RUN corepack enable && pnpm install --frozen-lockfile && pnpm build
FROM node:22-alpine
WORKDIR /app
COPY --from=build /app/.output ./.output
EXPOSE 3000
CMD ["node", ".output/server/index.mjs"]
静态托管
两种玩法:
- SSG 保留 SSR 内容(
ssr: true,默认)。nuxt generate预渲染路由,生成200.html/404.html作为动态路由的 SPA fallback。 - 纯 CSR SPA(
ssr: false)。nuxt generate会输出一个标准index.html,在浏览器里 hydrate。
把 .output/public/ 上传到任意静态托管 —— S3、Cloudflare Pages、Netlify、Vercel、GitHub Pages 都行。
Serverless / Edge 预设
Nuxt 自带 15+ Nitro preset。配置里指定:
export default defineNuxtConfig({
nitro: { preset: 'vercel' },
})
或者通过环境变量:
NITRO_PRESET=vercel pnpm build
NITRO_PRESET=netlify pnpm build
NITRO_PRESET=cloudflare-pages pnpm build
NITRO_PRESET=deno-deploy pnpm build
NITRO_PRESET=aws-lambda pnpm build
大多数托管平台(Vercel、Netlify、Cloudflare Pages)能自动识别 Nuxt 并选中 preset。
环境变量
仅服务端的密钥放 runtimeConfig,用 NUXT_* 环境变量覆盖:
NUXT_API_SECRET=prod_secret
NUXT_PUBLIC_API_BASE=https://api.example.com
客户端需要的 key 放到 runtimeConfig.public。
发版 checklist
- [ ]
pnpm typecheck/pnpm lint/pnpm test全部通过。 - [ ] 本地
pnpm build成功。 - [ ] 平台上配好必要环境变量(
NUXT_*、DB URL、密钥)。 - [ ]
routeRules检查一遍 —— 能预渲染的预渲染,必须 SSR 的才 SSR。 - [ ] 公共路由配好
cache/swr头。 - [ ] 需要健康检查的平台加上
/healthz。 - [ ] 日志收集已接入(大多数平台
console就够)。 - [ ] 错误上报插件已启用(
vue:error+ 服务端error钩子)。
CDN / Cloudflare 注意事项
用 Cloudflare 代理时,关掉这两项:
- Speed → Content Optimization → Rocket Loader™
- Security → Email Address Obfuscation
它们注入的脚本会破坏 hydration。
回滚方案
- Serverless 平台至少保留两个构建版本 —— 旧页面 tab 还持有老的 chunk URL,要让它们能拿到响应(或让 Nuxt 的 chunk-error 处理器硬刷新)。
- 打 Git tag(
git tag v1.2.3),便于快速回滚。
不止 Node
- Deno ——
NITRO_PRESET=deno-deploy或deno-server。 - Bun —— 目前用 Node preset 也能跑;原生 Bun preset 处于 beta。
- Workers / Workerd ——
cloudflare-pages、cloudflare-workerspreset 一等公民支持routeRules映射。
有了 preset 系统,换运行时就是一次配置更改 + NITRO_PRESET。“一次构建、随处部署”,这就是 Nuxt 给你的承诺。