一直想写一个优秀开源npm包的分享与学习系列,长久写,持续写。但深知坚持不容易,且万事开头难。

今天刚好有些闲暇,在看一些webpack loader源码的时候,发现一个不错的包——Ajv,有了一种想学习和分享之的冲动。于是这个系列就有了开头。

官网

https://ajv.js.org/,官网上有如下描述:

The fastest JSON-Schema validator for Node.js and browser. Supports draft-04/06/07.

JSON-Schema是什么呢?在学习ajv之前我也不知道,甚至没听过。但这丝毫不影响我们使用ajv,因为理解它很简单。

使用

先来看看ajv在node上怎么使用吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const Ajv = require('ajv')
const ajv = new Ajv({allErrors: true})

// 这就是JSON-Schema
const schema = {
properties: {
foo: { type: 'string' },
bar: { type: 'number', 'maximum': 3 }
}
}

const validate = ajv.compile(schema)

test({foo: 'abc', bar: 2})
test({foo: 2, bar: 4})

function test(data) {
// 校验JSON数据是否符合schema的定义
const valid = validate(data)
if (valid) {
// 为true,校验通过
console.log('Valid!')
} else {
// 不通过,打印出错误原因
console.log('Invalid: ' + ajv.errorsText(validate.errors))
}
}

怎么样,😎关于JSON-Schema的定义是不是有点眼熟?如果你正在使用Vue或者React,会发现它很像props中对属性类型的定义。又或者你正在使用ORM(如Sequelize),它很像定义Model时对字段的描述。

实际上,JSON-Schema正是一种基于JSON格式定义JSON数据结构的规范。ajv正是基于JSON-Schema定义来对JSON格式进行校验的工具。JSON-Schema的使用应该是极其广泛的,在任何需要以JSON格式输入输出的地方,如webpack loader的选项配置,对接口返回格式的约束,接口文档的输出(如swagger),你的开发工具的自定义配置,甚至生成随机数据(还记得mockjs吗)等,都是它发挥强大作用的地方。

周边插件

  • ajv-async 可以启用异步校验模式
  • ajv-cli 可以让你在命令行上使用ajv
  • ajv-errors 可以实现详细的自定义错误信息
  • ajv-i18n 可以国际化错误信息
  • ajv-keywords 扩展JSON-Schema的关键字,很强大

要学会使用ajv,最好的方式是掌握JSON-Schema,这是后来补上的关于JSON-Schema的详细介绍——传送门