环境变量管理 #

什么是环境变量? #

环境变量是在运行时传递给应用程序的配置值,常用于:

text
┌─────────────────────────────────────────────────────┐
│                   环境变量用途                       │
├─────────────────────────────────────────────────────┤
│ • API 密钥和令牌                                    │
│ • 数据库连接字符串                                  │
│ • 第三方服务配置                                    │
│ • 环境区分(开发/测试/生产)                        │
│ • 功能开关                                          │
└─────────────────────────────────────────────────────┘

配置方式 #

方式一:控制台配置 #

text
Site settings → Build & deploy → Environment

步骤:

  1. 进入站点设置
  2. 找到 Build & deploy → Environment
  3. 点击 “Add a variable”
  4. 输入 Key 和 Value
  5. 点击 Save

方式二:netlify.toml 配置 #

toml
[build.environment]
  NODE_VERSION = "18"
  NPM_VERSION = "9"
  MY_API_KEY = "your-api-key"

方式三:CLI 配置 #

bash
# 设置环境变量
netlify env:set API_KEY "your-api-key"

# 导入 .env 文件
netlify env:import .env

# 列出所有环境变量
netlify env:list

环境变量优先级 #

text
优先级从高到低:

1. 控制台设置
      ↓
2. netlify.toml 中的 context 特定配置
      ↓
3. netlify.toml 中的 [build.environment]
      ↓
4. Netlify 默认值

多环境管理 #

按部署上下文配置 #

toml
# 全局环境变量
[build.environment]
  NODE_VERSION = "18"

# 生产环境
[context.production.environment]
  API_URL = "https://api.example.com"
  NODE_ENV = "production"

# 预览环境(Deploy Preview)
[context.deploy-preview.environment]
  API_URL = "https://staging-api.example.com"
  NODE_ENV = "preview"

# 分支部署
[context.branch-deploy.environment]
  API_URL = "https://dev-api.example.com"
  NODE_ENV = "development"

# 特定分支
[context.staging.environment]
  API_URL = "https://staging-api.example.com"
  NODE_ENV = "staging"

部署上下文类型 #

上下文 说明
production 主分支部署
deploy-preview PR 预览部署
branch-deploy 其他分支部署
staging 名为 staging 的分支

敏感信息处理 #

安全原则 #

text
┌─────────────────────────────────────────────────────┐
│              敏感信息处理最佳实践                    │
├─────────────────────────────────────────────────────┤
│ ✅ 使用控制台设置敏感变量                           │
│ ✅ 不要将密钥提交到 Git                            │
│ ✅ 使用 .env 文件并在 .gitignore 中忽略            │
│ ✅ 定期轮换密钥                                    │
│ ❌ 不要在 netlify.toml 中写密钥                    │
│ ❌ 不要在前端代码中暴露服务端密钥                  │
└─────────────────────────────────────────────────────┘

.env 文件示例 #

bash
# .env.local(添加到 .gitignore)
API_KEY=sk_live_xxxxx
DATABASE_URL=postgres://user:pass@host:5432/db
STRIPE_SECRET_KEY=sk_live_xxxxx

导入到 Netlify #

bash
netlify env:import .env.local

前端环境变量 #

React (CRA) #

bash
# 必须以 REACT_APP_ 开头
REACT_APP_API_URL=https://api.example.com
REACT_APP_API_KEY=your-key

使用:

javascript
const apiUrl = process.env.REACT_APP_API_URL;
const apiKey = process.env.REACT_APP_API_KEY;

Vite #

bash
# 必须以 VITE_ 开头
VITE_API_URL=https://api.example.com
VITE_API_KEY=your-key

使用:

javascript
const apiUrl = import.meta.env.VITE_API_URL;
const apiKey = import.meta.env.VITE_API_KEY;

Next.js #

bash
# 客户端变量(以 NEXT_PUBLIC_ 开头)
NEXT_PUBLIC_API_URL=https://api.example.com

# 服务端变量(仅服务端可访问)
DATABASE_URL=postgres://...

使用:

javascript
// 客户端
const apiUrl = process.env.NEXT_PUBLIC_API_URL;

// 服务端(API Routes, getServerSideProps)
const dbUrl = process.env.DATABASE_URL;

Vue #

bash
# 必须以 VUE_APP_ 开头
VUE_APP_API_URL=https://api.example.com

使用:

javascript
const apiUrl = process.env.VUE_APP_API_URL;

Serverless Functions 环境变量 #

访问环境变量 #

javascript
// netlify/functions/api.js
exports.handler = async (event, context) => {
  const apiKey = process.env.API_KEY;
  const dbUrl = process.env.DATABASE_URL;
  
  return {
    statusCode: 200,
    body: JSON.stringify({
      message: 'OK',
      hasKey: !!apiKey
    })
  }
}

函数专用变量 #

toml
[functions]
  directory = "netlify/functions"

[functions."my-function"]
  [functions."my-function".environment]
    FUNCTION_SPECIFIC_VAR = "value"

变量替换 #

构建时替换 #

Netlify 在构建时会替换以下内置变量:

变量 说明
NETLIFY 始终为 true
NETLIFY_DEV 本地开发时为 true
SITE_NAME 站点名称
SITE_ID 站点 ID
DEPLOY_ID 部署 ID
DEPLOY_URL 部署 URL
DEPLOY_PRIME_URL 主 URL
CONTEXT 部署上下文
BRANCH 分支名称
COMMIT_REF 提交 SHA
REPOSITORY_URL 仓库 URL

使用示例 #

javascript
const deployUrl = process.env.DEPLOY_URL;
const branch = process.env.BRANCH;
const context = process.env.CONTEXT;

console.log(`Deployed from ${branch} to ${deployUrl}`);

本地开发 #

.env 文件 #

bash
# .env.development
API_URL=http://localhost:3000/api
NODE_ENV=development

netlify dev #

bash
netlify dev

自动加载:

  • .env
  • .env.local
  • .env.development
  • Netlify 控制台中的环境变量

链接站点 #

bash
netlify link

链接后,netlify dev 会从远程站点拉取环境变量。

环境变量管理 CLI #

查看变量 #

bash
netlify env:list

设置变量 #

bash
netlify env:set VARIABLE_NAME "value"

获取变量值 #

bash
netlify env:get VARIABLE_NAME

删除变量 #

bash
netlify env:unset VARIABLE_NAME

导入变量 #

bash
netlify env:import .env

导出变量 #

bash
netlify env:export > .env

常见问题 #

Q: 变量修改后需要重新部署吗? #

是的,环境变量在构建时注入,修改后需要触发重新部署。

Q: 如何在前端隐藏 API 密钥? #

前端代码会暴露给用户,无法真正隐藏。解决方案:

  1. 使用 Serverless Functions 作为代理
  2. 使用后端服务
  3. 限制 API 密钥的使用范围和域名

Q: 如何区分开发和生产环境? #

javascript
const isProduction = process.env.CONTEXT === 'production';
const isPreview = process.env.CONTEXT === 'deploy-preview';
const isDev = process.env.NETLIFY_DEV === 'true';

Q: 环境变量长度有限制吗? #

单个变量值最大 10KB,总变量大小最大 100KB。

最佳实践 #

1. 命名规范 #

bash
# 好的命名
API_URL=https://api.example.com
DATABASE_URL=postgres://...
STRIPE_SECRET_KEY=sk_live_xxx

# 不好的命名
url=https://api.example.com
key=xxx

2. 分组管理 #

bash
# API 相关
API_BASE_URL=https://api.example.com
API_KEY=xxx
API_TIMEOUT=30000

# 数据库相关
DB_HOST=localhost
DB_PORT=5432
DB_NAME=mydb

3. 使用 .env.example #

bash
# .env.example(提交到 Git)
API_URL=
API_KEY=
DATABASE_URL=

4. 环境隔离 #

toml
[context.production.environment]
  API_URL = "https://api.example.com"

[context.deploy-preview.environment]
  API_URL = "https://staging-api.example.com"

下一步 #

掌握了环境变量配置后,继续学习 构建钩子 了解如何自动化触发部署!

最后更新:2026-03-28