关键设计决策与 Issue/PR 依据
本章把“设计结论”与“社区证据”对齐,避免只讲理念不讲依据。
1. 决策:模型层先于视图层
结论:将表单状态管理放在 @formily/core,UI 只负责映射渲染。
源码依据:Form/Field 负责值、校验、联动、生命周期;React 层只桥接事件与上下文。
价值:跨框架、可测试、复杂联动可控。
2. 决策:主动联动 + 被动联动并存
结论:不强制单一联动范式。
源码依据:
- 主动:
onFieldValueChange/onForm*等 effect hooks。 - 被动:
createReactions + autorun/reaction。
价值:兼顾业务可读性(一对多)与表达力(多对一计算)。
3. 决策:数组操作必须做状态转置
结论:数组值变更必须同步迁移字段状态图。
源码依据:spliceArrayState/exchangeArrayState/cleanupArrayChildren。
演进证据:
说明:这是动态列表表单能否稳定运行的关键,不是“可选优化”。
4. 决策:表达式编译默认高能力,但开放可替换
结论:默认 new Function + with,并提供 registerCompiler。
源码依据:packages/json-schema/src/compiler.ts。
演进证据:
- CSP 兼容问题反馈:#4338
权衡:
- 默认能力强,适合低代码场景;
- 安全要求高的项目需要替换编译器。
5. 决策:响应式调度追求“正确 + 低噪声”
结论:不断修正链式 reaction 的遗漏与多余触发。
证据:
启示:响应式系统在复杂依赖下,性能优化必须建立在语义正确之上。
6. 决策:校验触发可配置(pattern/display 维度)
结论:允许用户控制 validator 在哪些交互模式/展示状态生效。
源码依据:shouldValidate() 判断 validatePattern/validateDisplay。
证据:
7. 决策:React 并发场景下做 GC 兜底
结论:observer tracker 释放不能完全依赖传统 unmount 路径。
源码依据:useCompatFactory + GarbageCollector。
价值:降低 StrictMode/并发场景下 reaction 泄漏风险。
8. 如何在技术讨论中使用这些证据
推荐结构:
- 先给设计结论(1 句话)。
- 再给源码锚点(类/函数名)。
- 最后给社区演进链接(Issue/PR)证明这是现实问题而非纸上理论。
这会显著提升你的“架构可信度表达”。