跳到正文

环境变量

Env Var

中级通用

环境变量(Env Var)是进程运行时从外部获得的名称和值,例如 API_BASE_URL 对应一个接口地址。它让同一份程序在本地、测试和线上使用不同配置,而不必为每个环境改一遍代码。

你可能会说:「我想让同一套代码在本地和线上连接不同的服务,别每次上线都改代码里的地址。」

读之前建议先了解

动手看看

MindSet 内容服务同一份 Node.js 程序,在不同环境中启动。
代码保持不变const base = process.env.API_BASE_URL; fetch(base + '/health');
本地开发 · 启动配置
API_BASE_URLhttp://localhost:3000
请求目标 · 模拟GET http://localhost:3000/health
测试环境 · 启动配置
API_BASE_URLhttps://api.staging.mindset.example
请求目标 · 模拟GET https://api.staging.mindset.example/health
线上环境 · 启动配置
API_BASE_URLhttps://api.mindset.example
请求目标 · 模拟GET https://api.mindset.example/health
运行环境
显示读取到的环境变量
模拟发送请求

切换运行环境,对照变量值和请求目标:代码与变量名都没变,变的是外部提供的值。这里模拟程序带着不同配置重新启动。

请求目标是读取到的地址加上 /health。这里仅展示模拟结果,不会访问网络;example 域名也是演示用的。

要点

  1. 1

    它是进程拿到的配置值

    你可以把它理解成启动程序时交给进程的一组“名称和值”。程序通过名称读取值,比如读取数据库地址。值从哪里设置,取决于你是在终端、本地开发工具还是部署平台启动它。

  2. 2

    改了值不等于程序已更新

    程序通常在启动或构建时读取这些值。所以你在部署平台改完配置,还要看它要求重启服务还是重新构建;否则正在运行的进程可能仍用旧值。排错时先确认值在哪个阶段被读取。

  3. 3

    变量本身不负责保密

    把密钥放进服务端进程的环境变量,可以避免直接写进代码仓库,但这不等于密钥绝对安全。如果构建工具把某个值打进前端代码,访问网站的人就可能看到它;密钥应只由服务端使用。

容易混淆的地方

环境变量和配置文件都能提供配置,区别在于交付方式:配置文件是程序读取的文件,环境变量由运行环境提供给进程。它也不是 API 密钥本身:密钥是一种凭证,环境变量只是传递它的方式。你可以用环境变量传密钥,但仍要控制谁能读取,以及它会不会进入前端产物。

什么时候用

适合用

  • 同一个网站要部署到预发布和生产环境,两边的 API 地址不同,用环境变量给各自的服务进程提供地址。
  • AI 工具的服务端要调用模型接口,把密钥交给部署平台配置,运行时读取,而不是写进代码仓库。
  • 本地开发和线上服务连接不同数据库,用同一个变量名提供各自的连接信息,减少改代码的次数。

不适合用

  • 用户在设置页切换深色模式,这是使用过程中的个人偏好;用应用状态或浏览器存储更合适。
  • 运营人员要随时调整所有用户看到的公告内容,这是业务数据;放在数据库或内容管理后台更合适。
  • 想让不同用户拥有不同的付费权益,这是按用户判断的权限;用账户数据和服务端权限控制更合适。

练一练

你做的 AI 网站在本地能调用模型,上线后却仍请求本地接口。团队希望同一份代码用于本地和线上。你会让 AI Agent 怎么改?

让 AI 帮你做

请检查项目里 API 地址和密钥目前从哪里读取,改为由服务端读取环境变量;给出本地与部署平台各自需要配置的变量名,说明变量在启动还是构建时生效。不要把密钥放进前端产物,也不要提交真实密钥。

接下来学什么