第19章 部署与环境变量
项目上线部署和环境配置
作者:zyyc-0336 | 日期:2026-06-12
本文是前端学习路径第19章(Next.js · 部署与环境变量)
上一章:样式与资源处理 | 下一章:Tailwind CSS 实用指南
在前面的章节中,我们已经学会了用 Next.js 构建完整的博客项目。现在是时候把它发布到互联网上,让全世界都能访问了!
前置知识:完成第17章项目实战,或有可部署的 Next.js 项目 难度等级:⭐⭐ 初级
19.1 什么是部署?
概念解释
部署(Deploy) 就是把你电脑上写好的代码,放到一台联网的服务器上,让其他人可以通过网址访问。
打个比方:
- 开发 = 在家里的厨房做菜
- 部署 = 把菜端到餐厅,让客人品尝
本地开发 vs 线上部署
| 对比项 | 本地开发 | 线上部署 |
|---|---|---|
| 访问方式 | localhost:3000 | 你的域名.vercel.app |
| 谁能访问 | 只有你自己 | 全世界 |
| 持久性 | 关掉电脑就没了 | 24小时运行 |
| 环境 | 你的电脑 | 服务器 |
19.2 Vercel 是什么?
概念解释
Vercel 是一个免费的前端部署平台,专门优化了 Next.js 项目的部署。它是 Next.js 的"娘家"(因为 Next.js 就是 Vercel 公司开发的)。
Vercel vs 其他平台
| 对比项 | Vercel | Netlify | 自己买服务器 |
|---|---|---|---|
| 费用 | 免费够用 | 免费够用 | 需要付费 |
| 难度 | ⭐ 超简单 | ⭐⭐ 简单 | ⭐⭐⭐⭐ 复杂 |
| Next.js支持 | 完美 | 好 | 需要自己配置 |
| 部署速度 | 秒级 | 分钟级 | 看配置 |
| 自定义域名 | ✅ 免费 | ✅ 免费 | 需要自己搞 |
新手易错提醒:Vercel 的免费版完全够个人项目使用,不需要花钱!不要被"高级功能"吓到。
19.3 一键部署到 Vercel
概念解释
Vercel 可以直接连接你的 GitHub 仓库,当你推送代码时自动部署。这叫 持续部署(Continuous Deployment)。
部署步骤
| 步骤 | 操作 | 说明 |
|---|---|---|
| 1 | 注册 Vercel | 用 GitHub 账号直接登录 |
| 2 | 创建项目 | 点击 "New Project" |
| 3 | 导入仓库 | 选择你的 GitHub 仓库 |
| 4 | 点击部署 | 点 "Deploy" 按钮 |
| 5 | 等待完成 | 大约 1-2 分钟 |
第一步:把代码推送到 GitHub
// 在项目根目录执行
// 1. 初始化 Git(如果还没做)
git init
// 2. 添加所有文件
git add .
// 3. 提交
git commit -m "第一次提交"
// 4. 关联远程仓库(替换为你的仓库地址)
git remote add origin https://github.com/你的用户名/你的仓库名.git
// 5. 推送
git push -u origin main
逐行讲解
git init:在当前文件夹创建 Git 仓库git add .:把所有文件加入暂存区(那个点表示"所有文件")git commit -m "...":提交并写说明git remote add ...:告诉 Git 远程仓库在哪里git push:把代码推送到 GitHub
第二步:在 Vercel 部署
- 打开 vercel.com
- 点击右上角 "Sign Up" 或 "Log In"
- 选择 "Continue with GitHub"(用 GitHub 登录)
- 登录后点击 "Add New Project"
- 找到你的仓库,点击 "Import"
- 点击 "Deploy"
- 等待部署完成,你会得到一个链接!
部署成功后,你会得到一个类似这样的链接:
https://你的项目名.vercel.app
新手易错提醒:
1. 确保项目根目录有
package.json文件2. 确保
package.json里有build脚本3. 确保代码没有报错(先在本地
npm run build试试)
自动部署
每次你推送代码到 GitHub,Vercel 会自动重新部署:
// 修改代码后
git add .
git commit -m "更新了首页"
git push
// Vercel 会自动检测到变化并重新部署
// 大约 1-2 分钟后,网站就会更新
19.4 什么是环境变量?
概念解释
环境变量(Environment Variables) 是存在系统里的"秘密配置",比如数据库密码、API密钥等。它们不会被写死在代码里,这样更安全。
打个比方:
- 代码 = 你的日记本(谁都能看)
- 环境变量 = 你的保险箱密码(只有你知道)
为什么需要环境变量?
| 场景 | 不用环境变量 | 用环境变量 |
|---|---|---|
| 数据库密码 | 写在代码里,危险! | 存在环境变量里,安全 |
| API密钥 | 代码泄露就完了 | 代码泄露也没事 |
| 切换环境 | 改代码 | 改配置文件 |
创建环境变量文件
在项目根目录创建 .env.local 文件:
// .env.local 文件内容
# 数据库连接字符串
DATABASE_URL="mysql://用户名:***@localhost:3306/数据库名"
# API 密钥
API_SECRET_KEY="你的秘密密钥123456"
# 其他配置
NEXT_PUBLIC_SITE_URL="https://你的网站.vercel.app"
逐行讲解
#开头的行是注释,不会被读取=左边是变量名,右边是值- 字符串建议用引号包起来
- 每行一个变量
环境变量文件类型
| 文件名 | 用途 | 是否提交到 Git |
|---|---|---|
.env | 通用环境变量 | ❌ 不提交 |
.env.local | 本地开发专用 | ❌ 不提交 |
.env.development | 开发环境 | ❌ 不提交 |
.env.production | 生产环境 | ❌ 不提交 |
.env.example | 示例文件(给别人看) | ✅ 提交 |
新手易错提醒:
1.
.env.local文件名前面有个点!2. 不要把
.env.local提交到 GitHub!记得在.gitignore里加上它3. 修改环境变量后,需要重启开发服务器
.gitignore 配置
确保你的 .gitignore 文件包含:
# 依赖
node_modules
# Next.js
.next
# 环境变量(重要!)
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
# 其他
.DS_Store
*.tsbuildinfo
19.5 NEXT_PUBLIC_ 前缀的秘密
概念解释
在 Next.js 中,环境变量有两种:
- 普通环境变量:只在服务器端可用
- NEXT_PUBLIC_ 开头的环境变量:客户端和服务端都能用
打个比方:
- 普通环境变量 = 后厨的配方(客人看不到)
- NEXT_PUBLIC_ 变量 = 菜单上的价格(客人看得到)
环境变量对比
| 对比项 | 普通变量 | NEXT_PUBLIC_ 变量 |
|---|---|---|
| 前缀 | 无 | 必须以 NEXT_PUBLIC_ 开头 |
| 客户端可用 | ❌ | ✅ |
| 服务端可用 | ✅ | ✅ |
| 适合存什么 | 数据库密码、API密钥 | 网站URL、公开配置 |
服务器端使用(API路由、Server Components)
// app/api/test/route.js
export async function GET() {
// 普通环境变量 - 只在服务器端可用
const dbUrl = process.env.DATABASE_URL
const apiKey = process.env.API_SECRET_KEY
return Response.json({
message: '环境变量测试',
hasDbUrl: !!dbUrl,
hasApiKey: !!apiKey
})
}
逐行讲解
process.env.DATABASE_URL:读取名为 DATABASE_URL 的环境变量!!双感叹号:把值转成布尔值(有值就是 true,没有就是 false)- 我们只检查是否存在,不返回真实值(安全!)
客户端使用(页面、组件)
// app/page.js
export default function Home() {
// NEXT_PUBLIC_ 变量 - 客户端可用
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL
return (
<div>
<h1>环境变量测试</h1>
<p>网站地址:{siteUrl}</p>
</div>
)
}
逐行讲解
- 变量名必须以
NEXT_PUBLIC_开头 - 用法和普通环境变量一样,都是
process.env.变量名 - 这个变量会暴露给浏览器,所以不要放敏感信息
新手易错提醒:
1.
NEXT_PUBLIC_是下划线,不是中划线2. 客户端用的变量没加
NEXT_PUBLIC_前缀会返回undefined3. 不要把数据库密码等敏感信息放在
NEXT_PUBLIC_变量里
环境变量命名示例
# ✅ 正确:敏感信息用普通变量
DATABASE_URL="mysql://..."
API_SECRET_KEY="sk-123456"
# ✅ 正确:公开信息用 NEXT_PUBLIC_ 变量
NEXT_PUBLIC_SITE_URL="https://example.com"
NEXT_PUBLIC_SITE_NAME="我的网站"
19.6 实战:API 中使用环境变量
创建使用环境变量的 API
// app/api/users/route.js
// 辅助函数:获取环境变量
function getDbConfig() {
return {
url: process.env.DATABASE_URL,
apiKey: process.env.API_SECRET_KEY
}
}
// GET 请求 - 获取用户列表
export async function GET() {
const config = getDbConfig()
// 模拟数据(实际项目中从数据库获取)
const users = [
{ id: 1, name: '张三', email: '***@example.com' },
{ id: 2, name: '李四', email: 'lisi@example.com' }
]
return Response.json({
success: true,
data: users,
configStatus: {
hasDbUrl: !!config.url,
hasApiKey: !!config.apiKey
}
})
}
// POST 请求 - 创建新用户
export async function POST(request) {
const config = getDbConfig()
// 检查配置
if (!config.url) {
return Response.json(
{ error: '数据库未配置' },
{ status: 500 }
)
}
try {
const body = await request.json()
// 这里应该是真实的数据库操作
// const result = await db.query('INSERT INTO users ...', [body.name, body.email])
return Response.json({
success: true,
message: '用户创建成功',
user: { id: 3, ...body }
})
} catch (error) {
return Response.json(
{ error: '请求格式错误' },
{ status: 400 }
)
}
}
逐行讲解
getDbConfig():一个辅助函数,用于获取环境变量process.env.DATABASE_URL:读取数据库连接字符串process.env.API_SECRET_KEY:读取 API 密钥!!config.url:检查变量是否存在- 错误处理:如果环境变量缺失,返回友好的错误信息
在前端调用这个 API
// app/page.js
export default async function Home() {
// 调用 API
const response = await fetch(process.env.NEXT_PUBLIC_SITE_URL + '/api/users', {
cache: 'no-store' // 不缓存,每次请求最新数据
})
const data = await response.json()
return (
<div>
<h1>用户列表</h1>
{data.success ? (
<ul>
{data.data.map(user => (
<li key={user.id}>
{user.name} - {user.email}
</li>
))}
</ul>
) : (
<p>加载失败:{data.error}</p>
)}
</div>
)
}
完整的 .env.local 示例
# ========== 数据库配置 ==========
DATABASE_URL="postgresql://username:***@localhost:5432/blog_db"
# ========== 第三方服务 ==========
# 图床 API 密钥
IMAGE_UPLOAD_API_KEY="your-image-upload-key"
# 邮件服务
SMTP_PASSWORD="your-smtp-password"
# ========== 公开配置(可用 NEXT_PUBLIC_ 前缀)==========
# 网站 URL
NEXT_PUBLIC_SITE_URL="https://my-blog.vercel.app"
# Google Analytics
NEXT_PUBLIC_GA_ID="G-XXXXXXXXXX"
# 网站名称
NEXT_PUBLIC_SITE_NAME="我的博客"
新手易错提醒:
1. 不要把真实的密码写在教程或示例代码里
2. 在 Vercel 部署时,需要在 Vercel 控制台设置环境变量
3. 本地开发用
.env.local,线上环境在 Vercel 设置
在 Vercel 设置环境变量
部署到 Vercel 后,需要在 Vercel 控制台设置环境变量:
| 步骤 | 操作 |
|---|---|
| 1 | 登录 Vercel 控制台 |
| 2 | 选择你的项目 |
| 3 | 点击 "Settings" |
| 4 | 点击 "Environment Variables" |
| 5 | 添加变量名和值 |
| 6 | 选择环境(Production/Preview/Development) |
| 7 | 点击 "Save" |
设置后,重新部署项目,环境变量就会生效!
本章复盘——部署与环境变量核心要点
| 要点 | 说明 |
|---|---|
| 环境变量 | .env 文件管理开发/生产配置 |
| next.config.js | 自定义构建和运行时配置 |
| Vercel 部署 | 零配置一键部署到云端 |
| 自托管 | next build + next start 本地部署 |
下一章预告(第20章):我们将学习Tailwind CSS 实用指南——原子化 CSS 框架实战。
本文档由 zyyc-0336 编写,最后更新:2026-06-14