schema-dsl 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (109) hide show
  1. package/.eslintignore +10 -0
  2. package/.eslintrc.json +27 -0
  3. package/.github/CODE_OF_CONDUCT.md +45 -0
  4. package/.github/ISSUE_TEMPLATE/bug_report.md +57 -0
  5. package/.github/ISSUE_TEMPLATE/config.yml +11 -0
  6. package/.github/ISSUE_TEMPLATE/feature_request.md +45 -0
  7. package/.github/ISSUE_TEMPLATE/question.md +31 -0
  8. package/.github/PULL_REQUEST_TEMPLATE.md +70 -0
  9. package/.github/SECURITY.md +184 -0
  10. package/.github/workflows/ci.yml +35 -0
  11. package/CHANGELOG.md +633 -0
  12. package/CONTRIBUTING.md +368 -0
  13. package/LICENSE +21 -0
  14. package/README.md +1122 -0
  15. package/STATUS.md +273 -0
  16. package/docs/FEATURE-INDEX.md +521 -0
  17. package/docs/INDEX.md +224 -0
  18. package/docs/api-reference.md +1098 -0
  19. package/docs/best-practices.md +672 -0
  20. package/docs/cache-manager.md +336 -0
  21. package/docs/design-philosophy.md +602 -0
  22. package/docs/dsl-syntax.md +654 -0
  23. package/docs/dynamic-locale.md +552 -0
  24. package/docs/error-handling.md +703 -0
  25. package/docs/export-guide.md +459 -0
  26. package/docs/faq.md +576 -0
  27. package/docs/frontend-i18n-guide.md +290 -0
  28. package/docs/i18n-user-guide.md +488 -0
  29. package/docs/label-vs-description.md +262 -0
  30. package/docs/markdown-exporter.md +398 -0
  31. package/docs/mongodb-exporter.md +279 -0
  32. package/docs/multi-type-support.md +319 -0
  33. package/docs/mysql-exporter.md +257 -0
  34. package/docs/plugin-system.md +542 -0
  35. package/docs/postgresql-exporter.md +290 -0
  36. package/docs/quick-start.md +761 -0
  37. package/docs/schema-helper.md +340 -0
  38. package/docs/schema-utils.md +492 -0
  39. package/docs/string-extensions.md +480 -0
  40. package/docs/troubleshooting.md +471 -0
  41. package/docs/type-converter.md +319 -0
  42. package/docs/type-reference.md +219 -0
  43. package/docs/validate.md +486 -0
  44. package/docs/validation-guide.md +484 -0
  45. package/examples/array-dsl-example.js +227 -0
  46. package/examples/custom-extension.js +85 -0
  47. package/examples/dsl-match-example.js +74 -0
  48. package/examples/dsl-style.js +118 -0
  49. package/examples/dynamic-locale-configuration.js +348 -0
  50. package/examples/dynamic-locale-example.js +287 -0
  51. package/examples/export-demo.js +130 -0
  52. package/examples/i18n-full-demo.js +310 -0
  53. package/examples/i18n-memory-safety.examples.js +268 -0
  54. package/examples/markdown-export.js +71 -0
  55. package/examples/middleware-usage.js +93 -0
  56. package/examples/password-reset/README.md +153 -0
  57. package/examples/password-reset/schema.js +26 -0
  58. package/examples/password-reset/test.js +101 -0
  59. package/examples/plugin-system.examples.js +205 -0
  60. package/examples/simple-example.js +122 -0
  61. package/examples/string-extensions.js +297 -0
  62. package/examples/user-registration/README.md +156 -0
  63. package/examples/user-registration/routes.js +92 -0
  64. package/examples/user-registration/schema.js +150 -0
  65. package/examples/user-registration/server.js +74 -0
  66. package/index.d.ts +1999 -0
  67. package/index.js +270 -0
  68. package/index.mjs +30 -0
  69. package/lib/adapters/DslAdapter.js +653 -0
  70. package/lib/adapters/index.js +20 -0
  71. package/lib/config/constants.js +286 -0
  72. package/lib/config/patterns/creditCard.js +9 -0
  73. package/lib/config/patterns/idCard.js +9 -0
  74. package/lib/config/patterns/index.js +8 -0
  75. package/lib/config/patterns/licensePlate.js +4 -0
  76. package/lib/config/patterns/passport.js +4 -0
  77. package/lib/config/patterns/phone.js +9 -0
  78. package/lib/config/patterns/postalCode.js +5 -0
  79. package/lib/core/CacheManager.js +376 -0
  80. package/lib/core/DslBuilder.js +740 -0
  81. package/lib/core/ErrorCodes.js +233 -0
  82. package/lib/core/ErrorFormatter.js +342 -0
  83. package/lib/core/JSONSchemaCore.js +347 -0
  84. package/lib/core/Locale.js +119 -0
  85. package/lib/core/MessageTemplate.js +89 -0
  86. package/lib/core/PluginManager.js +448 -0
  87. package/lib/core/StringExtensions.js +209 -0
  88. package/lib/core/Validator.js +316 -0
  89. package/lib/exporters/MarkdownExporter.js +420 -0
  90. package/lib/exporters/MongoDBExporter.js +162 -0
  91. package/lib/exporters/MySQLExporter.js +212 -0
  92. package/lib/exporters/PostgreSQLExporter.js +289 -0
  93. package/lib/exporters/index.js +24 -0
  94. package/lib/locales/en-US.js +65 -0
  95. package/lib/locales/es-ES.js +66 -0
  96. package/lib/locales/fr-FR.js +66 -0
  97. package/lib/locales/index.js +8 -0
  98. package/lib/locales/ja-JP.js +66 -0
  99. package/lib/locales/zh-CN.js +93 -0
  100. package/lib/utils/LRUCache.js +174 -0
  101. package/lib/utils/SchemaHelper.js +240 -0
  102. package/lib/utils/SchemaUtils.js +313 -0
  103. package/lib/utils/TypeConverter.js +245 -0
  104. package/lib/utils/index.js +13 -0
  105. package/lib/validators/CustomKeywords.js +203 -0
  106. package/lib/validators/index.js +11 -0
  107. package/package.json +70 -0
  108. package/plugins/custom-format.js +101 -0
  109. package/plugins/custom-validator.js +200 -0
@@ -0,0 +1,602 @@
1
+ # Schema-DSL 设计理念与架构
2
+
3
+ > **更新时间**: 2025-12-29
4
+ > **目的**: 解释 Schema-DSL 的设计决策、架构选择和性能权衡
5
+
6
+ ---
7
+
8
+ ## 📑 目录
9
+
10
+ - [核心设计理念](#核心设计理念)
11
+ - [为什么选择运行时解析](#为什么选择运行时解析)
12
+ - [编译时构建的局限性](#编译时构建的局限性)
13
+ - [性能对比与权衡](#性能对比与权衡)
14
+ - [架构设计](#架构设计)
15
+ - [适用场景](#适用场景)
16
+ - [与其他库对比](#与其他库对比)
17
+
18
+ ---
19
+
20
+ ## 核心设计理念
21
+
22
+ ### 设计优先级
23
+
24
+ ```
25
+ 灵活性 > 易用性 > 性能
26
+ ```
27
+
28
+ Schema-DSL 的设计不追求极致性能,而是在以下三者之间寻求最佳平衡:
29
+
30
+ 1. **灵活性** - 支持动态验证规则、配置驱动、多租户
31
+ 2. **易用性** - 简洁的 DSL 语法,5分钟上手
32
+ 3. **性能** - 足够快(27万+ ops/s),满足大多数场景
33
+
34
+ ---
35
+
36
+ ## 为什么选择运行时解析?
37
+
38
+ ### 关键决策:运行时 vs 编译时
39
+
40
+ Schema-DSL 选择**运行时解析 DSL**,而非**编译时构建**(如 Zod),这是有意为之的设计选择。
41
+
42
+ ### ✅ 运行时解析的 5 大优势
43
+
44
+ #### 1. 完全动态性
45
+
46
+ **问题**: 编译时构建的 Schema 在运行时无法修改
47
+
48
+ **Schema-DSL 的解决方案**:
49
+ ```javascript
50
+ // ✅ 从配置文件读取验证规则
51
+ const config = require('./validation-config.json');
52
+ const schema = dsl({
53
+ username: `string:${config.username.min}-${config.username.max}!`
54
+ });
55
+
56
+ // ✅ 从数据库读取验证规则
57
+ const rules = await db.collection('validation_rules').findOne({
58
+ entity: 'user'
59
+ });
60
+ const schema = dsl({
61
+ username: `string:${rules.username.min}-${rules.username.max}!`,
62
+ email: 'email!',
63
+ age: `number:${rules.age.min}-${rules.age.max}`
64
+ });
65
+
66
+ // ✅ 根据环境动态调整
67
+ const maxLength = process.env.NODE_ENV === 'development' ? 100 : 32;
68
+ const schema = dsl({
69
+ username: `string:3-${maxLength}!`
70
+ });
71
+
72
+ // ✅ 根据用户角色动态调整
73
+ function getUserSchema(userRole) {
74
+ const maxLength = userRole === 'admin' ? 100 : 32;
75
+ return dsl({
76
+ username: `string:3-${maxLength}!`
77
+ });
78
+ }
79
+ ```
80
+
81
+ **Zod 的限制**:
82
+ ```typescript
83
+ // ❌ Schema 必须在编译时确定
84
+ const schema = z.object({
85
+ username: z.string().min(3).max(32) // 固定值
86
+ });
87
+
88
+ // ❌ 无法运行时动态调整
89
+ ```
90
+
91
+ ---
92
+
93
+ #### 2. 多租户 SaaS 系统支持
94
+
95
+ **真实场景**: 每个租户有不同的验证规则
96
+
97
+ **Schema-DSL 的解决方案**:
98
+ ```javascript
99
+ // ✅ 租户配置存储在数据库
100
+ const tenantRules = {
101
+ 'tenant-a': { username: { min: 3, max: 32 } },
102
+ 'tenant-b': { username: { min: 5, max: 50 } },
103
+ 'tenant-c': { username: { min: 2, max: 20 } }
104
+ };
105
+
106
+ // ✅ 动态生成 Schema
107
+ function getTenantSchema(tenantId) {
108
+ const rules = tenantRules[tenantId];
109
+ return dsl({
110
+ username: `string:${rules.username.min}-${rules.username.max}!`,
111
+ email: 'email!'
112
+ });
113
+ }
114
+
115
+ // ✅ 新增租户 = 插入数据库记录,零代码修改
116
+ ```
117
+
118
+ **Zod 的限制**:
119
+ ```typescript
120
+ // ❌ 必须为每个租户硬编码 Schema
121
+ const tenantASchema = z.object({ username: z.string().min(3).max(32) });
122
+ const tenantBSchema = z.object({ username: z.string().min(5).max(50) });
123
+ // ... 新增租户 = 修改代码 = 重新部署
124
+ ```
125
+
126
+ ---
127
+
128
+ #### 3. 可序列化(存储、传输、共享)
129
+
130
+ **问题**: 编译时构建的 Schema 是 JavaScript 对象,无法序列化
131
+
132
+ **Schema-DSL 的解决方案**:
133
+ ```javascript
134
+ // ✅ DSL 是字符串,可以序列化
135
+ const schemaConfig = {
136
+ username: 'string:3-32!',
137
+ email: 'email!',
138
+ age: 'number:18-120'
139
+ };
140
+
141
+ // ✅ 可以存储到:
142
+ // - JSON 文件
143
+ fs.writeFileSync('schema.json', JSON.stringify(schemaConfig));
144
+
145
+ // - 数据库
146
+ await db.collection('schemas').insert({
147
+ entity: 'user',
148
+ rules: schemaConfig
149
+ });
150
+
151
+ // - Redis
152
+ redis.set('user:schema', JSON.stringify(schemaConfig));
153
+
154
+ // - 配置中心(Nacos/Apollo)
155
+ await nacos.publishConfig({
156
+ dataId: 'user-validation',
157
+ group: 'DEFAULT_GROUP',
158
+ content: JSON.stringify(schemaConfig)
159
+ });
160
+
161
+ // ✅ 可以通过 HTTP API 传输
162
+ app.get('/api/validation-rules/:entity', async (req, res) => {
163
+ const rules = await db.findOne({ entity: req.params.entity });
164
+ res.json(rules); // 直接返回 DSL
165
+ });
166
+
167
+ // ✅ 前后端共享规则
168
+ // 后端定义规则 → API 传输 → 前端使用相同的 DSL
169
+ fetch('/api/validation-rules/user')
170
+ .then(res => res.json())
171
+ .then(rules => {
172
+ const schema = dsl(rules); // 前后端验证规则完全一致
173
+ });
174
+ ```
175
+
176
+ **Zod 的限制**:
177
+ ```typescript
178
+ // ❌ Schema 是对象,无法序列化
179
+ const schema = z.object({
180
+ username: z.string().min(3).max(32)
181
+ });
182
+
183
+ // ❌ JSON.stringify(schema) → 无法正确序列化
184
+ // ❌ 无法存储到数据库
185
+ // ❌ 无法通过 API 传输
186
+ ```
187
+
188
+ ---
189
+
190
+ #### 4. 数据库驱动的验证规则
191
+
192
+ **真实场景**: 后台管理系统,管理员可配置表单验证规则
193
+
194
+ **Schema-DSL 的解决方案**:
195
+ ```javascript
196
+ // ✅ 管理员在后台界面配置验证规则
197
+ // 后台界面:
198
+ // - 字段名:username
199
+ // - 类型:string
200
+ // - 最小长度:3
201
+ // - 最大长度:32
202
+ // - 必填:是
203
+
204
+ // ✅ 规则存储到数据库
205
+ await db.collection('form_rules').insert({
206
+ formId: 'user_registration',
207
+ fields: {
208
+ username: 'string:3-32!',
209
+ email: 'email!',
210
+ age: 'number:18-120'
211
+ }
212
+ });
213
+
214
+ // ✅ 应用使用最新规则(无需重启)
215
+ app.post('/api/users', async (req, res) => {
216
+ // 从数据库读取最新规则
217
+ const formRules = await db.collection('form_rules').findOne({
218
+ formId: 'user_registration'
219
+ });
220
+
221
+ // 动态生成 Schema
222
+ const schema = dsl(formRules.fields);
223
+
224
+ // 验证
225
+ const result = validate(schema, req.body);
226
+ if (!result.valid) {
227
+ return res.status(400).json({ errors: result.errors });
228
+ }
229
+
230
+ // ... 业务逻辑
231
+ });
232
+
233
+ // ✅ 管理员修改规则后,立即生效,无需重启服务
234
+ ```
235
+
236
+ **Zod 的限制**:
237
+ ```typescript
238
+ // ❌ 无法从数据库动态加载规则
239
+ // ❌ 验证规则必须硬编码在代码中
240
+ // ❌ 修改规则 = 修改代码 = 重新部署
241
+ ```
242
+
243
+ ---
244
+
245
+ #### 5. 低代码/无代码平台基础
246
+
247
+ **真实场景**: 可视化表单构建器
248
+
249
+ **Schema-DSL 的解决方案**:
250
+ ```javascript
251
+ // ✅ 可视化表单构建器配置
252
+ const formBuilder = {
253
+ formId: 'contact',
254
+ title: '联系我们',
255
+ fields: [
256
+ {
257
+ name: 'name',
258
+ label: '姓名',
259
+ type: 'text',
260
+ validation: 'string:2-50!', // ← 在 UI 中配置
261
+ placeholder: '请输入您的姓名'
262
+ },
263
+ {
264
+ name: 'email',
265
+ label: '邮箱',
266
+ type: 'email',
267
+ validation: 'email!',
268
+ placeholder: '请输入您的邮箱'
269
+ },
270
+ {
271
+ name: 'message',
272
+ label: '留言',
273
+ type: 'textarea',
274
+ validation: 'string:10-500!',
275
+ placeholder: '请输入您的留言'
276
+ }
277
+ ]
278
+ };
279
+
280
+ // ✅ 自动生成验证 Schema
281
+ const schema = dsl(
282
+ formBuilder.fields.reduce((acc, field) => {
283
+ acc[field.name] = field.validation;
284
+ return acc;
285
+ }, {})
286
+ );
287
+
288
+ // ✅ 自动生成前端表单
289
+ function renderForm(formBuilder) {
290
+ return formBuilder.fields.map(field => (
291
+ `<div>
292
+ <label>${field.label}</label>
293
+ <input name="${field.name}" placeholder="${field.placeholder}" />
294
+ </div>`
295
+ ));
296
+ }
297
+
298
+ // ✅ 这是低代码平台的基础能力
299
+ // - 用户在界面拖拽表单
300
+ // - 配置验证规则(无需写代码)
301
+ // - 自动生成前后端代码
302
+ ```
303
+
304
+ ---
305
+
306
+ ### ⚠️ 其他场景
307
+
308
+ #### A/B 测试验证规则
309
+
310
+ ```javascript
311
+ // ✅ 从配置中心读取 A/B 测试配置
312
+ const abTestConfig = await configCenter.get('user_validation_ab_test');
313
+
314
+ const schema = dsl({
315
+ username: abTestConfig.userInGroupA
316
+ ? 'string:2-50!' // A 组:宽松规则
317
+ : 'string:5-20!' // B 组:严格规则
318
+ });
319
+
320
+ // 修改配置中心的值,立即生效,无需重新部署
321
+ ```
322
+
323
+ #### 灰度发布
324
+
325
+ ```javascript
326
+ // ✅ 根据灰度比例动态选择规则
327
+ const grayConfig = await configCenter.get('validation_gray_config');
328
+ const useNewRules = Math.random() < grayConfig.grayRatio;
329
+
330
+ const schema = dsl(useNewRules ? newRules : oldRules);
331
+ ```
332
+
333
+ ---
334
+
335
+ ## 编译时构建的局限性
336
+
337
+ ### Zod 等编译时库的限制
338
+
339
+ | 限制 | 说明 | 影响 |
340
+ |------|------|------|
341
+ | **无法动态调整** | Schema 在编译时固定 | 无法根据配置/环境/用户动态生成 |
342
+ | **无法序列化** | Schema 是 JavaScript 对象 | 无法存储、传输、共享 |
343
+ | **多租户困难** | 必须为每个租户写代码 | 新增租户 = 修改代码 = 重新部署 |
344
+ | **数据库驱动困难** | 无法从数据库读取规则 | 后台配置表单验证无法实现 |
345
+ | **配置驱动困难** | 必须硬编码 Schema | 无法从配置文件/API 动态生成 |
346
+ | **前后端共享困难** | 无法通过 API 传输 | 前后端验证规则容易不一致 |
347
+ | **低代码平台不适合** | 无法可视化配置 | 不适合低代码/无代码场景 |
348
+
349
+ ---
350
+
351
+ ## 性能对比与权衡
352
+
353
+ ### 真实性能测试结果
354
+
355
+ **测试环境**: Node.js v20.19.4, 10,000次迭代
356
+
357
+ | 库名 | 每秒操作数 | 10,000次耗时 | 相对速度 | 排名 |
358
+ |------|-----------|-------------|---------|------|
359
+ | **Ajv** | 2,000,000 ops/s | 5ms | 1.0x | 🥇 第1 |
360
+ | **Zod** | 526,316 ops/s | 19ms | 0.26x | 🥈 第2 |
361
+ | **Schema-DSL** | **277,778 ops/s** | **36ms** | **0.14x** | 🥉 **第3** |
362
+ | Joi | 97,087 ops/s | 103ms | 0.05x | 第4 |
363
+ | Yup | 60,241 ops/s | 166ms | 0.03x | 第5 |
364
+
365
+ ### 性能分析
366
+
367
+ **为什么 Schema-DSL 比 Zod 慢?**
368
+
369
+ ```
370
+ Schema-DSL 的执行流程:
371
+ DSL 字符串
372
+ ↓ 解析 (~5-10μs)
373
+ DSL 对象
374
+ ↓ 转换 (~3-5μs)
375
+ JSON Schema
376
+ ↓ Ajv 编译 (~2-3μs)
377
+ 验证函数
378
+ ↓ 执行验证 (~0.5-1μs)
379
+ 结果
380
+
381
+ 总开销:~12-21μs
382
+
383
+ Zod 的执行流程:
384
+ Schema 定义(编译时完成)
385
+ ↓ 直接验证 (~3-5μs)
386
+ 结果
387
+
388
+ 总开销:~3-6μs
389
+
390
+ 差距:Schema-DSL 多了约 9-15μs 的开销
391
+ ```
392
+
393
+ **性能瓶颈分布**:
394
+ 1. DSL 解析(40-50%)
395
+ 2. JSON Schema 转换(20-30%)
396
+ 3. 多语言处理(10-20%)
397
+ 4. Ajv 编译(10-15%)
398
+
399
+ ---
400
+
401
+ ### 性能权衡分析
402
+
403
+ **损失**:
404
+ ```
405
+ - 比 Zod 慢 1.89倍
406
+ - 比 Ajv 慢 7.2倍
407
+ - 每次验证多花 9-15μs
408
+ ```
409
+
410
+ **换来的价值**:
411
+ ```
412
+ ✅ 代码量减少 65%
413
+ 'string:3-32!' vs z.string().min(3).max(32)
414
+
415
+ ✅ 完全动态的验证规则
416
+ 可从配置/数据库/API 动态生成
417
+
418
+ ✅ 多租户支持
419
+ 每个租户不同规则,零代码修改
420
+
421
+ ✅ 可序列化
422
+ 可存储、传输、共享
423
+
424
+ ✅ 前后端共享规则
425
+ 一套规则,两端使用
426
+
427
+ ✅ 低代码平台基础
428
+ 可视化配置表单验证
429
+
430
+ ✅ 数据库驱动
431
+ 管理员后台配置,立即生效
432
+ ```
433
+
434
+ ### 性能优化措施
435
+
436
+ **v2.3.0 缓存优化**:
437
+ ```javascript
438
+ // Schema 缓存:5000条(提升 5倍)
439
+ // 正则缓存:500条(提升 2.5倍)
440
+ // LRU 驱逐机制
441
+
442
+ // 效果:
443
+ // - 大型项目(3000 Schema):3倍提升
444
+ // - 超大型项目(10000 Schema):5-10倍提升
445
+ ```
446
+
447
+ ---
448
+
449
+ ## 架构设计
450
+
451
+ ### 核心组件
452
+
453
+ ```
454
+ ┌─────────────────────────────────────┐
455
+ │ DSL 字符串 │
456
+ │ 'string:3-32!', 'email!' │
457
+ └──────────────┬──────────────────────┘
458
+
459
+
460
+ ┌─────────────────────────────────────┐
461
+ │ DslAdapter (解析器) │
462
+ │ 正则解析 → DSL 对象 │
463
+ └──────────────┬──────────────────────┘
464
+
465
+
466
+ ┌─────────────────────────────────────┐
467
+ │ JSONSchemaCore (转换器) │
468
+ │ DSL 对象 → JSON Schema │
469
+ └──────────────┬──────────────────────┘
470
+
471
+
472
+ ┌─────────────────────────────────────┐
473
+ │ Ajv (验证引擎) │
474
+ │ JSON Schema → 验证函数 │
475
+ └──────────────┬──────────────────────┘
476
+
477
+
478
+ ┌─────────────────────────────────────┐
479
+ │ ErrorFormatter (错误格式化) │
480
+ │ Ajv 错误 → 友好消息 → 多语言 │
481
+ └──────────────┬──────────────────────┘
482
+
483
+
484
+ ┌─────────────────────────────────────┐
485
+ │ ValidationResult │
486
+ │ { valid, errors, data } │
487
+ └─────────────────────────────────────┘
488
+ ```
489
+
490
+ ### 缓存机制
491
+
492
+ ```javascript
493
+ // Schema 缓存(v2.3.0)
494
+ SCHEMA_CACHE: LRU(5000) // DSL → JSONSchema
495
+ REGEX_CACHE: LRU(500) // 正则表达式
496
+
497
+ // 缓存命中:0μs 开销
498
+ // 缓存未命中:12-21μs 开销
499
+ ```
500
+
501
+ ---
502
+
503
+ ## 适用场景
504
+
505
+ ### ✅ 选择 Schema-DSL
506
+
507
+ **最适合的场景**:
508
+
509
+ 1. **多租户 SaaS 系统**
510
+ - 每个租户不同验证规则
511
+ - 新增租户零代码修改
512
+
513
+ 2. **后台管理系统**
514
+ - 管理员配置表单验证
515
+ - 规则立即生效,无需重启
516
+
517
+ 3. **配置驱动开发**
518
+ - 验证规则存储在配置文件/数据库
519
+ - 可通过 API 动态获取
520
+
521
+ 4. **低代码/无代码平台**
522
+ - 可视化表单构建器
523
+ - 拖拽配置验证规则
524
+
525
+ 5. **快速原型开发**
526
+ - 5分钟上手
527
+ - 代码量最少
528
+
529
+ 6. **前后端共享验证**
530
+ - 一套规则,两端使用
531
+ - 通过 API 传输
532
+
533
+ 7. **A/B 测试/灰度发布**
534
+ - 动态切换验证规则
535
+ - 配置驱动
536
+
537
+ ### ⚠️ 考虑其他库
538
+
539
+ **不适合 Schema-DSL 的场景**:
540
+
541
+ 1. **极致性能要求**
542
+ - 需要 >50万 ops/s
543
+ - 推荐:**Ajv** 或 **Zod**
544
+
545
+ 2. **TypeScript 强类型推断**
546
+ - 需要运行时类型守卫
547
+ - 推荐:**Zod**
548
+
549
+ 3. **静态验证规则**
550
+ - 规则固定,不需要动态性
551
+ - 推荐:**Zod**(更快 + 类型推断)
552
+
553
+ ---
554
+
555
+ ## 与其他库对比
556
+
557
+ ### 综合对比
558
+
559
+ | 维度 | Schema-DSL | Zod | Ajv | Joi |
560
+ |------|-----------|-----|-----|-----|
561
+ | **性能** | 🥉 278k ops/s | 🥈 526k ops/s | 🥇 2M ops/s | 97k ops/s |
562
+ | **动态性** | ✅✅ 完全动态 | ❌ 编译时固定 | ⚠️ 部分动态 | ⚠️ 部分动态 |
563
+ | **语法简洁性** | ✅✅ 最简洁 | ⚠️ 较冗长 | ❌ 最冗长 | ⚠️ 较冗长 |
564
+ | **TypeScript** | ⚠️ 基础 | ✅✅ 强大 | ⚠️ 基础 | ⚠️ 基础 |
565
+ | **序列化** | ✅✅ 支持 | ❌ 不支持 | ⚠️ 部分支持 | ❌ 不支持 |
566
+ | **多租户** | ✅✅ 容易 | ❌ 困难 | ⚠️ 可以 | ⚠️ 可以 |
567
+ | **配置驱动** | ✅✅ 完美 | ❌ 不支持 | ⚠️ 可以 | ⚠️ 可以 |
568
+ | **数据库导出** | ✅✅ 唯一 | ❌ | ❌ | ❌ |
569
+ | **学习曲线** | ✅✅ 5分钟 | ⚠️ 30分钟 | ❌ 1小时 | ⚠️ 30分钟 |
570
+
571
+ ---
572
+
573
+ ## 结论
574
+
575
+ ### Schema-DSL 的价值主张
576
+
577
+ **不是最快,但综合最优**:
578
+
579
+ ```
580
+ 综合评分:22/25分(第1名)
581
+
582
+ 优势:
583
+ ✅ 语法最简洁(代码量减少 65%)
584
+ ✅ 动态性最强(唯一支持配置驱动)
585
+ ✅ 功能最全(独家:DB导出、用户语言包)
586
+ ✅ 易用性最佳(5分钟上手)
587
+ ✅ 性能优秀(第3名,比 Joi/Yup 快 2-4倍)
588
+
589
+ 权衡:
590
+ ⚠️ 性能不是最快(比 Zod 慢 1.9倍)
591
+ ⚠️ TypeScript 类型推断有限
592
+
593
+ 定位:
594
+ 灵活性和易用性优先的验证库
595
+ 适合需要动态规则的场景
596
+ ```
597
+
598
+ ---
599
+
600
+ **更新日期**: 2025-12-29
601
+ **版本**: v2.3.0
602
+