Schema-DSL 设计理念与架构
更新时间: 2026-05-07
目的: 阐述 Schema-DSL 的设计理念、架构优势与性能定位
📑 目录
核心设计理念
设计优先级
Schema-DSL v2 完成全量 TypeScript 重构,在三个维度上均达到行业领先水平:
- 性能强劲 — 有效数据路径超越 Zod,无效数据公平对比快 109 倍;底层 AJV + 全链路 WeakMap 缓存,V8 优化充分
- 简单易学 — DSL 语法极简,
'string:3-32!'vsz.string().min(3).max(32),5 分钟上手 - 功能强大 — 动态验证、i18n 多语言、DB 导出、条件验证、插件系统,完整 TypeScript 类型安全
为什么选择运行时解析?
关键决策:运行时 vs 编译时
Schema-DSL 选择运行时解析 DSL,而非编译时构建(如 Zod),这是有意为之的设计选择。
✅ 运行时解析的 5 大优势
1. 完全动态性
问题: 编译时构建的 Schema 在运行时无法修改
Schema-DSL 的解决方案:
Zod 的限制:
2. 多租户 SaaS 系统支持
真实场景: 每个租户有不同的验证规则
Schema-DSL 的解决方案:
Zod 的限制:
3. 可序列化(存储、传输、共享)
问题: 编译时构建的 Schema 是 JavaScript 对象,无法序列化
Schema-DSL 的解决方案:
Zod 的限制:
4. 数据库驱动的验证规则
真实场景: 后台管理系统,管理员可配置表单验证规则
Schema-DSL 的解决方案:
Zod 的限制:
5. 低代码/无代码平台基础
真实场景: 可视化表单构建器
Schema-DSL 的解决方案:
⚠️ 其他场景
A/B 测试验证规则
灰度发布
编译时构建的局限性
Zod 等编译时库的限制
性能对比与权衡
真实性能测试结果(v2 基准,分场景对比)
测试环境: Node.js v20.20.2, tinybench,JSON Schema 同维度对比
ℹ️ 绝对 ops/s 数值随测试机器 CPU 性能而变化;相对倍数(vs Zod 列)是稳定的跨机器指标,以下分析均基于倍数。
ℹ️ S2 使用validate(schema, data, { format: false })关闭 i18n 格式化,与其他库保持相同条件(均不做 i18n 模板渲染),是真正的苹果对苹果比较。
ℹ️ Ajv (raw) 是 schema-dsl 的底层引擎,差值即为 schema-dsl 自身层(DSL 解析 + coerce + 缓存)的开销。
性能分析
Schema-DSL vs Zod 对比结论
- 有效数据场景(S1):schema-dsl 与 Zod 基本持平;S3 嵌套场景快约 28%
- 无效数据公平对比(S2,均无 i18n 格式化):schema-dsl 1.205M vs Zod 13.49K — schema-dsl 快约 89x
⚠️ Zod 在无效数据场景极慢的根因:Zod 的错误收集路径使用异常驱动机制(
try/catch控制流),每个无效字段抛出一次 Error,4 个错误字段 = 4 次 Error 实例创建 + 4 次堆栈捕获,这是其约 13.49K ops/s 的直接原因。相比之下 schema-dsl 基于 AJV 的无异常收集路径,无格式化时达 1.205M ops/s。
性能瓶颈分布(冷启动):
- DSL 解析(40-50%)
- JSON Schema 转换(20-30%)
- 多语言处理(10-20%)
- Ajv 编译(10-15%)
性能权衡分析
与 Ajv (raw) 的差距:
换来的价值:
性能优化措施
缓存优化
架构设计
核心组件
缓存机制
适用场景
✅ 选择 Schema-DSL
最适合的场景:
-
多租户 SaaS 系统
- 每个租户不同验证规则
- 新增租户零代码修改
-
后台管理系统
- 管理员配置表单验证
- 规则立即生效,无需重启
-
配置驱动开发
- 验证规则存储在配置文件/数据库
- 可通过 API 动态获取
-
低代码/无代码平台
- 可视化表单构建器
- 拖拽配置验证规则
-
快速原型开发
- 5分钟上手
- 代码量最少
-
前后端共享验证
- 一套规则,两端使用
- 通过 API 传输
-
A/B 测试/灰度发布
- 动态切换验证规则
- 配置驱动
⚠️ 以下场景可能有更优选择
-
追求代码生成级极致吞吐量
- 需要 fastest-validator 级别性能(compile 为原生 JS 函数)
- 推荐:fastest-validator(但需放弃 JSON Schema 标准兼容)
-
以 Schema → 静态类型推断为核心目标
- 需要从 Schema 自动导出精确的 TypeScript 类型(如
z.infer<typeof schema>) - 推荐:Zod(schema-dsl 提供完整 TypeScript API 类型安全,但不做 Schema → 类型推断)
- 需要从 Schema 自动导出精确的 TypeScript 类型(如
-
静态规则 + 团队已深度投入 Zod
- 迁移成本大于收益时,保持现状即可
与其他库对比
综合对比
结论
Schema-DSL 的价值主张
性能强劲 · 简单易学 · 功能强大:
更新日期: 2026-05-08
对应示例文件
示例入口: design-philosophy.ts
说明: 通过“配置生成 DSL → 序列化 → 反序列化 → 再验证”的完整闭环,展示运行时解析和可序列化这两个核心设计点。