模块模式与存取器协同构建“可控黑盒”:模块封装状态边界与生命周期,存取器拦截读写并注入校验、鉴权与审计逻辑,实现响应式系统的访问控制与数据安全。

模块模式与存取器(getter/setter)协同,本质是把状态封装成“可控黑盒”:模块负责隔离作用域与职责边界,存取器负责拦截读写、注入校验与审计逻辑。这不是简单加法,而是让响应式系统具备访问控制能力——既保持数据自动更新的便利性,又杜绝越权修改与脏数据流入。
用模块封装状态边界,避免全局污染
模块不是命名空间,而是独立的状态生命周期单元。每个模块应有明确的输入契约(如初始化参数)、内部状态结构、以及对外暴露的有限接口(仅限必要 getter 和受控 setter)。例如,用户权限模块不暴露 rawRoles 数组,而只提供 canAccess(resource) 方法;配置模块不导出整个 config 对象,而是按需提供 getTheme()、isDevMode() 等只读存取器。
- 模块间通过显式依赖声明通信,禁止跨模块直接访问 state 属性
- 模块初始化时执行 schema 校验(如用 zod 验证初始值),失败则抛出明确错误,不进入运行态
- 模块可自带清理钩子(如 onUnmount),自动注销监听或释放资源,防止内存泄漏
存取器不只是语法糖,而是安全网关
在响应式框架中,存取器必须介入响应式链路起点。Vue3 中应在 reactive 包裹前对原始对象属性定义 setter;React 中则需结合 Proxy 或自定义 Hook 封装 useState 返回值。关键在于:所有写操作必须经过 setter,且该 setter 要做三件事——鉴权、格式校验、变更日志记录。
- setter 内部调用权限检查函数(如 checkPermission('update', field)),拒绝非法字段或越权用户
- 对输入值做类型归一化(如字符串 trim、数字 parseInt、日期 new Date()),防止无效值污染响应式源头
- 触发变更时同步写入轻量日志(含时间戳、操作者、字段路径、旧值/新值),便于回溯与审计
响应式树的构建需分层确权,而非扁平共享
整棵树不应只有一个根 store。应按数据敏感度与访问范围分层:核心凭证类状态(如 token、role)放在高权限模块,仅暴露不可变视图;业务配置类放中间层,允许部分字段可写但需签名验证;UI 临时状态(如折叠面板开关)放低层,由组件私有管理。各层之间通过事件总线或回调注入通信,而非直接引用 state。
- 高敏感层模块的 setter 必须要求操作上下文(如当前登录用户 ID、操作签名 nonce)
- 中层模块支持乐观更新,但 commit 前需向后端发起幂等校验请求,失败则 revert 并提示
- 低层模块可跳过鉴权,但 setter 仍应做基础类型约束,避免 NaN、undefined 等意外值触发渲染异常
类型系统与运行时校验双保险
TypeScript 类型仅在编译期生效,无法阻止运行时恶意篡改。因此模块导出的存取器必须包含运行时断言。例如,定义一个 userStore 模块,其 name setter 不仅标注为 string 类型,还应内置 /^[\u4e00-\u9fa5a-zA-Z\s]{2,20}$/.test(value) 正则校验;email setter 应调用完整邮箱格式解析库,而非简单匹配 @ 符号。
- 所有 setter 入参先经 Joi 或 Zod schema 验证,失败则 throw Error 并附带违规字段路径
- getter 可返回只读代理(Object.freeze 或 Proxy with get trap),防止外部意外修改返回对象
- 模块导出的 API 表面是普通对象,底层全部由 Proxy 动态生成,确保每次访问都走安全路径


















