代码读 process.env.API_KEY;本地 .env.local、线上 secrets 管理器注入。仓库被 clone 不泄露任何密钥,轮换只改注入值。
数据与服务 · 运行与可靠性
环境变量Environment Variable
环境(dev / staging / production)是一份命名的部署上下文:同一份构建到哪儿都跑,只是按环境读不同的环境变量。配置随环境换、代码不变,密钥永远不进 git。
切环境不改代码,密钥永远不进仓库
在 dev / staging / production 三个标签间切换,看同一份代码读出完全不同的配置;再把 API_KEY 写进代码并提交,看 git 历史立刻翻成危险态、部署被挡下。
变量生产 production 的值
DATABASE_URLpostgres://prod-db/app
LOG_LEVELwarn
错误堆栈隐藏堆栈
FEATURE_BILLINGoff
API_KEY已注入 · 不回显
git 仓库仓库不含密钥
.env 已在 .gitignore 中;仓库只提交 .env.example 列变量名和格式,真实值由部署环境注入。
选中 生产 production:代码不变,下方配置全由环境变量决定。下一步:切到其它环境看同一份代码读出不同值,或部署当前环境。
面板教会的事
把刚才操作里出现的因果关系,提炼成可复述的几条。
- 配置随环境切换:DATABASE_URL、LOG_LEVEL、错误堆栈、FEATURE_BILLING 的值都来自环境变量;切 dev / prod 时代码一行没改。
- 同一份构建跑遍三环境:dev → staging → production 是配置升级阶梯,构建产物不变,只换注入的值。
- NODE_ENV 还会翻转运行时行为:生产压住错误堆栈、开启压缩与缓存,开发放开详细日志——这同样由环境决定。
- 密钥绝不进 git:API_KEY 写进代码 = 进入 git 历史,删文件也抹不掉,必须轮换;正确做法是 secrets 管理器注入,仓库只留 .env.example。
什么时候用
出现这些信号,先怀疑环境,而不是先改代码。
- 「本地能跑、上生产就报错」——多半是环境之间漂移:数据不同、配置不同、规模不同。
- 同一个 bug 只在生产复现——先逐项比对环境变量,而不是急着改代码。
- 想给预发布单独开新功能、暂关生产——用 FEATURE_* 环境变量,而不是另开一条分支。
环境不是万能分身:如果两个环境的行为差异大到要走不同代码路径,那是配置没收敛,而不是再多开一个环境。
怎么用
从写代码到部署的最短路径。
- 代码里只读
process.env.DATABASE_URL这类变量名,不写任何具体值。 - 仓库提交
.env.example,只列变量名和格式;.env写进.gitignore。 - 本机用
.env.local,部署平台用 secrets 管理器按 dev / staging / prod 注入。 - 启动时校验必需变量,缺失就立刻失败、只列出变量名(不回显值),别等第一次请求才返回含糊 500。
- 部署后核对当前环境读到的是对的值(DB 连接、日志级别、功能开关),再宣布上线。
正反例:同一份代码,只改密钥放哪
差异只在「密钥进不进仓库」这一处。
看似省事,但密钥进入 git 历史;删除文件也抹不掉。任何人 clone 仓库、任何 PR 的 diff 都能读到,泄露面无限大,必须立即轮换。
快速自测
生产报了一个本地复现不了的错,而且你刚把一个新功能开关打开。下一步最该先看什么?
继续查证
术语的技术定义和行为以这些一手或权威资料为准。
下一步学
和本知识点经常一起出现的概念。