上篇 —— async-validator 源码解析(三):rule —— 将 async-validator
校验库的 validator
目录下的代码进行了分析,下面继续自底向上进入到最上层index.js
,分析 async-validator
校验库的核心 Schema类
。
由于 Schema类
的代码整体较长,所以本篇先除去代码量较大的原型链define
和validate
方法的相关内容,看其他部分的结构、属性和方法。可以从仓库 https://github.com/MageeLin/async-validator-source-code-analysis 的 analysis
分支看到本篇中的每个文件的代码分析。
已完成:
- async-validator 源码解析(一):文档翻译
- async-validator 源码解析(二):rule
- async-validator 源码解析(三):validator
- async-validator 源码解析(四):Schema 类
- async-validator 源码解析(五):校验方法 validate
依赖关系
代码依赖关系如下所示:
按照从底向上的方式,本篇主要分析 index.js
文件中的 Schema类
及相关的 utils
工具方法 、 messages.js
默认消息。
Schema 类
Schema类
就是 async-validator
库的标准使用方式,在文档中使用 Schema
的方式就是如下几步:
- 引入
async-validator
的Schema
。 - 定义校验规则
descriptor
。 new
一个Schema
实例。- 调用实例的
validate
方法(回调函数方式或者promise
方式)。
文档中的调用 demo
如下:
1 | // 官方文档中的demo |
所以首先从 Schema
的构造函数开始入手。
构造函数
构造函数分了三步:
this
上定义了个实例属性rules
为null
。this
上定义了一个实例私有属性_messages
,初始值为messages.js
文件里的内容。- 调用原型链
define
方法,传参descriptor
。
1 | // index.js |
原型链上的 define
方法是核心,而且代码比较长,所以本篇暂不解析 Schema.prototype.define
相关的方法,放在下一篇。
messages.js
在 Schema
的构造函数和静态方法中,都用到了从messages.js
中引过来的 defaultMessages
。可以看出,文件中都是针对不同类型的失败校验设置的提示消息模板。
1 | // index.js |
message
本来就是针对不同的失败校验提供不同提示消息,所以这个 message
模板对不同的项目来说可能需要定制化。官方文档中也提供了如何给实例添加 message
的 demo
。
1 | // demo |
demo
中利用了方法Schema.prototype.message
来进行 messages
的深度合并,看一下这块的代码:
1 | // message方法的相关代码 |
可以发现此处的深度合并是有 bug 的,只能达到两级深合并,target[s]
和 value
再往下一级就只能合并引用而不能合并值了。但是恰巧默认的 messages
只有两级的深度,所以这种写法当前情况是没有问题的。
专门看了下 git
记录,翻到了之前的issue
。原来之前使用的 lodash
的 mergeWith
进行合并,后来next
的开发者提了意见,嫌弃 lodash
的包体积太大,所以作者用手写的 merge
代替了 lodash
的 mergeWith
。
warning
官方文档中也给出了控制台警告信息的显示控制,就是在实例化 Schema
之前设置 warning
方法,只要把 warning
方法设置为一个空函数就能屏蔽控制台警告。
1 | // demo |
下面看看源代码中关于 warning
是怎么写的。
1 | // index.js |
可以发现 warning
本身就被设为了一个空函数,只有在开发环境或非 node运行时
,才会用 console.warn
打印出 errors
数组中的每一个 error
。
validators
在上一篇中已经发现,写各种各样的 rule
规则其实都是转化为 validator
校验器来处理的。所以官方给留了个静态方法用于添加自定义的 type
,方便进行自定义类型的校验(但是不知道为啥官方文档中没写)。
1 | // index.js |
所以在实例化之前,调用 Schema
的静态方法 register(type, validator)
可以注册一个对自定义类型的校验规则。