配置(config) 安全与工程
别名:
配置层 · 配置项
把可变参数(模型名、密钥、端口、预算)从代码中分离出来、集中加载与合并的一层。本章采用三段式:默认值 < .env 文件 < 环境变量,按优先级合并成纯数据对象。见[第 23 章](/chapters/23-conclusion/)。
它是什么
配置层(config)把可变参数——模型名、密钥、端口、预算——从代码中分离出来,集中加载与合并。演进路线:硬编码 → 环境变量 → .env 文件 → 分层优先级合并。第 23 章采用的三段式:内置默认值 < .env 文件 < 进程环境变量,按优先级合并成一个纯数据对象,任何层、任何模块都能读它,而不必关心它来自哪里。这就是 ch22 的 loadConfig(env) 的延续:接口不变,只是来源从「一个 env 对象」变成「三层来源」。
合并不只是「后者覆盖前者」
两个细节:只合并已定义的键(某个层没设的键,留给下一层);数字/布尔字段要显式转换(环境变量全是字符串,Number() 一次,别在调用处散落转换)。合并完的配置还要过一遍密钥脱敏——打印有效配置、写启动日志、报错信息里带上配置时,一律走脱敏后的视图。
为什么值得单独讲一章
生产里「只靠一份环境变量」是不够的:export API_KEY=sk-xxx 每次打开新终端都要重设,shell 历史还会记住它;不同环境(本地、测试、生产)需要不同配置。这套分层思想直接对应 12-Factor App 的 Config 原则(配置与代码严格分离、按环境分组存储);.env 文件的解析约定来自 dotenv——本章不装库,自己写 30 行解析器,正是全书「先手写,再选型」的立场。