Oasis's Cloud

一个人的首要责任,就是要有雄心。雄心是一种高尚的激情,它可以采取多种合理的形式。
—— 《一个数学家的辩白》

源码分析——async-validator


async-validator 的优势

async-validator 是一款基于 TypeScript 开发的用于表单校验库。它可以用于验证 Vue、React 等前端框架中的表单数据。该库具有以下几个优点:

  1. 强大的验证功能:async-validator 支持各种常见的验证规则,如必填、最小值、最大值、长度、正则等,同时也支持自定义验证规则,可以满足不同的验证需求。
  2. 异步验证:async-validator 支持异步验证,可以用于处理一些需要从后台获取数据后才能进行验证的场景。
  3. 灵活性:async-validator 同时支持单个字段和多个字段的验证,可以通过配置来指定需要验证的字段和验证规则,这种灵活性能够满足各种不同的验证需求。
  4. 易用性:async-validator 使用简单,只需要引入库文件后,通过调用相应的方法就可以完成表单验证。
  5. 可扩展性:async-validator 的验证规则是可以扩展的,可以通过编写自定义验证规则来实现更复杂的验证功能。

async-validator 如何产生优势

下面的代码摘自 async-validator 仓库中的 README.md,这段代码展示了 async-validator 的核心概念。

import Schema from 'async-validator';
const descriptor = {
  name: {
    type: 'string',
    required: true,
    validator: (rule, value) => value === 'muji',
  },
  age: {
    type: 'number',
    asyncValidator: (rule, value) => {
      return new Promise((resolve, reject) => {
        if (value < 18) {
          reject('too young');  // reject with error message
        } else {
          resolve();
        }
      });
    },
  },
};
const validator = new Schema(descriptor);
validator.validate({ name: 'muji' }, (errors, fields) => {
  if (errors) {
    // validation failed, errors is an array of all errors
    // fields is an object keyed by field name with an array of
    // errors per field
    return handleErrors(errors, fields);
  }
  // validation passed
});

// PROMISE USAGE
validator.validate({ name: 'muji', age: 16 }).then(() => {
  // validation passed or without error message
}).catch(({ errors, fields }) => {
  return handleErrors(errors, fields);
});

上面代码中首先定义了一个 descriptor 常量,通过 descriptor 指向了声明式的校验规则,而数据则在调用 validate 方法时传入。这样的方式天然的在数据和校验规则之间划分出了清晰的边界,而且声明式的描述校验规则,扩展起来更容易。

async-validator 提供了声明式的校验规则描述,在被校验数据和规则之间划分了清晰的边界。async-validator 通过规则(Rules)和校验(Validate)两个元件构成。规则(Rules)用于描述数据应该如何校验,我们可以通过类型(Type)、信息(Message)两个抽象概念来描述规则。校验(Validate)通过输入规则和数据,产生校验结果,比如错误信息等。