JavaScript常量配置需统一入口、深冻结、类型约束与环境适配:通过单一模块导出冻结后的分组常量,用deepFreeze确保嵌套不可变,配合TypeScript字面量类型和ESLint规则实现开发期防护,并支持多环境及国际化扩展。

JavaScript 中常量配置项集中管理,关键不是“放一起就行”,而是建立可维护、不可篡改、易发现、跨环境可用的结构。单纯用 const 声明一堆对象,只是起点;真正可靠的做法需分层落地。
统一入口 + 模块封装
所有配置应从单一模块导出(如 constants/index.js 或 config/main.js),避免散落在各处。该模块只做三件事:定义原始配置、冻结、导出冻结后版本。
- 不导出未冻结的原始对象,也不导出构造函数或可变引用
- 使用
export default或具名导出(如export const API_CONFIG),保持导入语义清晰 - 按语义分组导出:比如
export { STATUS_CODE, FEATURE_FLAGS, ENV },方便按需解构
运行时不可变:冻结必须到位
const 只锁引用,Object.freeze() 锁一层属性,而业务配置往往嵌套——所以必须深冻结。
- 对扁平配置(如状态码映射):直接
Object.freeze({ OK: 200, ERROR: 500 }) - 对嵌套结构(如
{ api: { timeout: 5000, retry: { max: 3 } } }):使用自定义deepFreeze工具函数,且确保在任何模块 import 前完成冻结 - 冻结后尝试修改会静默失败(非严格模式)或抛
TypeError(严格模式),配合 ESLint 规则no-param-reassign提前拦截
开发期防护:类型 + 工具 + 约束
靠运行时冻结不够,得在写代码时就卡住漏洞。
立即学习“Java免费学习笔记(深入)”;
- TypeScript 中优先用
const enum或字面量类型(as const),让 IDE 和编译器识别值域,比如type Env = 'dev' | 'prod'; const CURRENT_ENV = 'prod' as const; - ESLint 启用
no-const-assign(防重赋值)、no-unused-vars(防废弃常量堆积) - 禁止在常量模块里混入函数、实例或异步逻辑——它们无法被安全冻结,也破坏纯数据语义
环境与扩展性支持
真实项目要区分开发/测试/生产,还要预留元数据(如中文标签、颜色、排序权重)。
- 用环境变量(
process.env.NODE_ENV)或构建时替换(如 Webpack DefinePlugin)注入基础环境常量 - 常量对象可设计为带方法的类(如
class StatusCode),但必须确保实例不可变,且只暴露只读访问器 - 需要翻译或展示文本时,不要硬编码字符串,而是通过键查表:
STATUS_LABELS[status],把文案抽离到 i18n 层


















