Skip to content

Next.js 环境变量 🔧

🎯 概述

环境变量用于存储配置信息,如 API 密钥、数据库连接等,Next.js 提供了强大的环境变量支持。

📦 基本用法

创建环境文件

bash
# .env.local (本地开发,不提交到 Git)
DATABASE_URL="postgresql://localhost:5432/mydb"
JWT_SECRET="your-secret-key"

# .env.production (生产环境)
DATABASE_URL="postgresql://prod-server:5432/mydb"

# .env (所有环境)
NEXT_PUBLIC_API_URL="https://api.example.com"

使用环境变量

tsx
// 服务端
const dbUrl = process.env.DATABASE_URL
const secret = process.env.JWT_SECRET

// 客户端 (必须以 NEXT_PUBLIC_ 开头)
const apiUrl = process.env.NEXT_PUBLIC_API_URL

🚀 环境文件优先级

.env.local          # 最高优先级
.env.production     # 生产环境
.env.development    # 开发环境
.env                # 默认

📝 客户端变量

NEXT_PUBLIC_ 前缀

bash
# .env.local
NEXT_PUBLIC_API_URL="https://api.example.com"
NEXT_PUBLIC_GA_ID="G-XXXXXXXXXX"
tsx
// 可以在客户端组件中使用
'use client'

export default function Component() {
  const apiUrl = process.env.NEXT_PUBLIC_API_URL
  return <div>{apiUrl}</div>
}

🎨 运行时配置

next.config.js

js
module.exports = {
  env: {
    CUSTOM_KEY: process.env.CUSTOM_KEY,
  },
  publicRuntimeConfig: {
    apiUrl: process.env.API_URL,
  },
  serverRuntimeConfig: {
    secret: process.env.SECRET,
  },
}

📊 类型安全

定义类型

ts
// env.d.ts
declare namespace NodeJS {
  interface ProcessEnv {
    DATABASE_URL: string
    JWT_SECRET: string
    NEXT_PUBLIC_API_URL: string
  }
}

验证环境变量

ts
// lib/env.ts
import { z } from 'zod'

const envSchema = z.object({
  DATABASE_URL: z.string().url(),
  JWT_SECRET: z.string().min(32),
  NEXT_PUBLIC_API_URL: z.string().url(),
})

export const env = envSchema.parse(process.env)

📚 最佳实践

1. 不要提交敏感信息

bash
# .gitignore
.env*.local
.env.production

2. 提供示例文件

bash
# .env.example
DATABASE_URL="postgresql://localhost:5432/mydb"
JWT_SECRET="your-secret-key-here"
NEXT_PUBLIC_API_URL="https://api.example.com"

3. 文档化

md
# 环境变量说明

## 必需变量
- `DATABASE_URL`: 数据库连接字符串
- `JWT_SECRET`: JWT 签名密钥 (至少 32 字符)

## 可选变量
- `NEXT_PUBLIC_API_URL`: API 基础 URL (默认: http://localhost:3000)

4. 验证启动时

ts
// lib/validate-env.ts
function validateEnv() {
  const required = ['DATABASE_URL', 'JWT_SECRET']
  
  for (const key of required) {
    if (!process.env[key]) {
      throw new Error(`Missing required environment variable: ${key}`)
    }
  }
}

validateEnv()

🔗 相关资源


下一步:学习 Next.js 监控和分析