readonly是Vue 3中用于创建只读响应式对象的工具,可防止意外修改配置等关键数据,开发时报警、生产时静默失败,支持深度保护且需配合provide/props、配置加载、Docker挂载及数据库只读模式共同构建安全防线。

在生产环境中,核心配置(如数据库连接串、密钥、服务地址)一旦被意外修改,轻则服务异常,重则引发数据泄露或业务中断。readonly 不是万能锁,但它是第一道轻量、高效、可验证的防护层——关键在于用对地方、用得及时。
Vue 场景:向子组件传递只读配置对象
前端常将全局配置通过 provide 或 props 注入子组件。若子组件误执行 config.apiBase = 'http://test',可能全站请求发错环境。
- 父组件中提前包装:const safeConfig = readonly(reactive({ apiBase: 'https://prod-api' }))
- 子组件接收后尝试赋值:props.config.apiBase = 'xxx' → 开发环境立刻报警告,生产环境静默失败
- 嵌套属性也受保护:safeConfig.db.creds.password = 'new' 同样被拦截
Node.js / 配置文件加载:冻结原始配置对象
服务启动时从 JSON/YAML 加载配置,应避免后续模块随意篡改。直接 Object.freeze() 仅浅层冻结,而 readonly(配合响应式库如 @vue/reactivity)或深度冻结工具更可靠。
- 不推荐:const config = require('./prod.config.json'); Object.freeze(config); —— 若 config 中含普通对象,其内部仍可改
- 推荐:const safeConfig = readonly(loadConfig('prod'))(使用同 Vue 的 readonly 工具函数,或用 deepFreeze)
- 启动时校验:if (isReadonly(safeConfig)) console.log('✅ 配置已锁定')
Docker 容器内:挂载只读配置卷
把 /etc/app/config.yaml 这类敏感配置以只读方式挂载,从操作系统层杜绝运行时篡改。
- 启动命令:docker run -v /host/config:/etc/app/config:ro myapp
- Docker Compose:volumes: - ./config:/etc/app/config:ro
- 验证是否生效:进入容器执行 echo test > /etc/app/config/config.yaml → 报错 Read-only file system
数据库与中间件:启用服务级只读模式
配置本身安全了,但若应用误连到从库并写入,或连上测试 Redis 执行 SET,风险仍在。需配合基础设施层只读策略:
- MySQL 从库:read_only = ON + super_read_only = ON(8.0.22+),并回收 root 的 SUPER 权限
- Redis 从节点:CONFIG SET slave-read-only yes,并写入 redis.conf
- PostgreSQL 物理从库:确认 SELECT pg_is_in_recovery() 返回 t,禁止手动 pg_ctl promote

















