第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 其他平台

对比项VercelNetlify自己买服务器
费用免费够用免费够用需要付费
难度⭐ 超简单⭐⭐ 简单⭐⭐⭐⭐ 复杂
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 部署

  1. 打开 vercel.com
  2. 点击右上角 "Sign Up" 或 "Log In"
  3. 选择 "Continue with GitHub"(用 GitHub 登录)
  4. 登录后点击 "Add New Project"
  5. 找到你的仓库,点击 "Import"
  6. 点击 "Deploy"
  7. 等待部署完成,你会得到一个链接!

部署成功后,你会得到一个类似这样的链接:

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 中,环境变量有两种:

  1. 普通环境变量:只在服务器端可用
  2. 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_ 前缀会返回 undefined

3. 不要把数据库密码等敏感信息放在 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