ES6 Class 配置管理类需封装读取、合并、校验与热更新,通过私有字段保护状态,提供只读 getter、路径式 get/set、多环境切换、类型校验及变更事件,职责清晰且不耦合业务。
用 ES6 Class 写配置管理类,核心是把配置的读取、合并、校验和动态更新封装成可复用、易维护的对象。它不是简单存个对象,而是要解决环境差异、默认值 fallback、不可变性控制和运行时热更新等实际问题。
定义基础结构与默认配置
Class 初始化时应支持传入初始配置,并内置合理的默认值。避免直接暴露原始配置对象,用私有字段(如 #config)保护内部状态,同时提供只读的 getter 接口。
- 构造函数接收可选的 options 参数,优先使用传入配置,缺失则回退到内置 defaults
- 用 Object.assign() 或结构赋值做浅合并;深层合并需额外工具(如 lodash.merge)或手动递归处理
- 建议默认配置写在 static 属性里,便于测试和继承扩展
支持多环境配置注入
实际项目常需区分 dev / test / prod 配置。可在 Class 中预留 env 字段,结合预加载的环境变量或 JSON 文件动态加载对应配置块。
- 例如:根据 process.env.NODE_ENV 或 window.__ENV__ 选择 config[env] 子对象进行合并
- 允许通过 setEnv() 方法切换环境并触发配置重载(注意副作用,如重连 API、刷新主题等)
- 避免硬编码环境名,用枚举或 Symbol 做校验,防止拼写错误导致静默失败
提供安全的读取与更新接口
不直接暴露 this.#config,而是通过 get(key, defaultValue) 和 set(key, value) 控制访问粒度。key 支持点号路径(如 "api.timeout"),便于嵌套取值。
- get 方法内部用 _.get 或自实现路径解析,未命中时返回 defaultValue 而非 undefined
- set 应限制为开发阶段可用,生产环境可禁用或仅允许特定 key(如 theme、locale)
- 变更后触发事件(如 new CustomEvent('configchange')),方便 UI 或模块响应
集成类型校验与初始化检查
配置出错往往在启动时难以发现。可在构造完成时运行 validate(),对关键字段(如 url、port、timeout)做基础类型和范围检查。
- 校验规则可声明在 static schema 属性中,格式如 { api: { url: 'string', timeout: 'number' } }
- 校验失败时抛出带上下文的 Error(如 ConfigValidationError),而非静默忽略
- 支持异步校验(如 ping 接口地址),但需明确标记为 initAsync(),避免阻塞实例化
这类配置类不需要过度设计,但得守住边界:不替代状态管理、不耦合业务逻辑、不自动监听文件变化——职责清晰,才容易被其他模块信任和复用。