Next.js 部署到 Vercel 最接近”一键上线”——但”几乎零配置”不是”零配置”。默认值能覆盖 90% 场景,剩下 10%(环境变量、自定义域名、图片域名、函数 region)能让独立开发者卡半天。
问题背景
Vercel 是 Next.js 母公司,集成深度无人能比——自动识别框架、每个 PR 自动 preview、静态资产边缘部署、Hobby 免费档够多数独立项目起步。代价是规模上来后按用量计费,以及绑定 Vercel 特有功能(ISR、边缘图片优化)。
判断标准
- 项目在 GitHub / GitLab / Bitbucket 仓库里。
- 想要每个 PR 都自动出 preview URL,不想自己搭 CI。
- 能接受 Hobby 配额用完按用量计费。
实操步骤
-
把 Next.js 项目推到 GitHub。本地没有 git 历史就先:
git init git add . git commit -m "initial commit" # 装了 gh CLI: gh repo create my-next-app --public --source=. --push # 没装就先在 github.com 建 repo,然后: git remote add origin https://github.com/<you>/my-next-app.git git branch -M main git push -u origin main -
登录 vercel.com(用同一个 Git 账号 OAuth 授权),点 Add New → Project,找到 repo,点 Import。Vercel 会自动识别 Next.js 并填好:
Framework Preset: Next.js Build Command: next build Output Directory: .next (留空即可,自动) Install Command: npm install -
同一页面的 Environment Variables 里粘环境变量。一行一对
KEY=VALUE:DATABASE_URL=postgresql://user:pass@host:5432/db NEXT_PUBLIC_SITE_URL=https://yoursite.com RESEND_API_KEY=re_xxxxxxxxxxxxxxxx每条变量右侧勾选生效环境(Production / Preview / Development)。同一个 KEY 可以在不同环境放不同值。本地用
.env.local同步——Vercel 不读.env.local,必须在 dashboard 里加。 -
点 Deploy。首次 build 通常 60–120 秒。完成后给你一个
<project>-<hash>.vercel.appURL。 -
打开生成的
*.vercel.app域名,DevTools → Console 看有没有 hydration 报错(典型:Hydration failed because the initial UI does not match what was rendered on the server);Network 面板看_next/static/*响应头:x-vercel-cache: HIT # 静态资源走 CDN age: 123 # 缓存命中后的秒数 -
加自定义域名。Settings → Domains → Add,输入
yoursite.com,按 Vercel 给的 DNS 记录去你的 DNS 商配:类型 名称 值 A @ 76.76.21.21 CNAME www cname.vercel-dns.comCloudflare 用户:proxy 状态切到 DNS only(灰云),让 Vercel 自己签 SSL;不然会 SSL handshake 失败。验证:
dig yoursite.com +short # 应返回 76.76.21.21 curl -sI https://yoursite.com | head -5 # HTTP/2 200 # server: Vercel -
配
next.config.js的图片白名单(用next/image加载外部域名图片必须配,否则报Invalid src prop):// next.config.js /** @type \{import('next').NextConfig\} */ const nextConfig = \{ images: \{ remotePatterns: [ \{ protocol: 'https', hostname: 'images.unsplash.com' \}, \{ protocol: 'https', hostname: 'cdn.yoursite.com' \}, ], \}, \}; module.exports = nextConfig; -
(可选)改函数 region。默认
iad1(弗吉尼亚),亚洲用户改hnd1(东京)或sin1(新加坡)。项目根新建vercel.json:\{ "functions": \{ "app/api/**": \{ "maxDuration": 10, "regions": ["hnd1"] \} \} \}或在 App Router 的 route segment 用边缘运行时:
// app/api/hello/route.ts export const runtime = 'edge'; -
验证 PR preview。新建分支推上去:
git checkout -b test-preview echo "<!-- test -->" >> README.md git commit -am "test preview" git push -u origin test-preview gh pr create --fillVercel 会在 PR 里贴出
<branch>-<hash>.vercel.apppreview URL,作为 check 之一。reviewer 点过去看就是这个分支的部署。
容易踩的坑
- 忘配环境变量,生产里本地能跑的字段全
undefined——Vercel 不读.env.local。 - 配了
output: 'export'然后发现 image optimization、API route、middleware 全没了。 next.config.js没配images.remotePatterns——next/image拒绝优化没在白名单里的外部图片。- 函数 region 留默认(
iad1),用户在另一个洲——vercel.json配 region 或export const runtime = 'edge'。 - 把 preview URL 当生产——算力配额一样但环境变量不同,promote 前要测过。
这篇适合谁
第一次部署 Next.js,或者不想运维 pipeline 想要 CI/CD 的独立开发者。
这篇不适合谁
高带宽纯静态站(Cloudflare Pages 或 Firebase Hosting 更便宜),或者已经在 AWS / GCP 上、想复用基础设施的项目。
FAQ
- Next.js 必须用 Vercel 吗?: 不必。Next.js 在任何能跑 Node 的地方都能跑——AWS、Cloudflare(通过 OpenNext)、自建。但 Vercel 集成最深,搬走会损失一些功能。
- Hobby 真免费吗?: 个人非商业用途免费,有带宽和函数执行配额。商业 / 团队要 Pro(2026 年 $20/人/月)。
- Vercel 每次 push 都自动部署吗?: 是的——
main部到生产,其它分支部到 preview。可以在 Settings 里按分支关掉。 - 能回滚吗?: 能——Deployments 里找上一个好版本,点 “Promote to Production”。即时回滚。