Lzh on GitHub

你好,我是 Valibot,我希望通过模式(schema)来帮助你轻松验证数据。无论数据是来自服务器、表单还是配置文件。我没有依赖项,可以在任何 JavaScript 环境中运行。

我强烈建议你阅读 发布公告,如果你和我一样是个技术宅,还可以阅读我的 学士论文

亮点

  • 完全类型安全,支持静态类型推断
  • 捆绑包体积小,起始大小不到 700 字节
  • 验证一切,从字符串到复杂对象
  • 开源且经过全面测试,覆盖率达 100%
  • 包含许多转换和验证操作
  • 源码结构良好,无依赖项
  • API 极简、可读、经过深思熟虑

示例

首先,你创建一个描述结构化数据集的模式(schema)。模式可以比作 TypeScript 中的类型定义。最大的区别是 TypeScript 类型是 “不执行的”,更像是开发体验(DX)功能。另一方面,模式除了推断的类型定义之外,还可以在运行时执行,以保证未知数据的类型安全。

import * as v from 'valibot'; // 1.31 kB

// 创建包含电子邮件和密码的登录模式
const LoginSchema = v.object({
  email: v.pipe(v.string(), v.email()),
  password: v.pipe(v.string(), v.minLength(8)),
});

// 推断登录模式的输出 TypeScript 类型为
// { email: string; password: string }
type LoginData = v.InferOutput<typeof LoginSchema>;

// 电子邮件和密码验证失败抛出错误
const output1 = v.parse(LoginSchema, { email: '', password: '' });

// 返回数据为 { email: string; password: string }
const output2 = v.parse(LoginSchema, {
  email: 'jane@example.com',
  password: '12345678',
});

除了 parse,我还提供基于非异常的 API safeParse 以及类型守卫函数 is。你可以在 这里 阅读更多信息。

比较

我没有依赖于几个包含许多方法的大型函数,我的 API 设计和源码基于许多小型、独立的函数,每个函数都只有一个任务。这种模块化设计有几个优点。

例如,这允许打包工具使用 import 语句来移除不需要的代码。这样,只有实际使用的代码才能进入你的生产构建。与 Zod 相比,这可以将捆绑包体积减小高达 95%。

此外,它允许你使用外部代码轻松扩展我的功能,并使我的源码更加健壮和安全,因为单个函数的功能可以通过单元测试更容易地进行测试。

鸣谢

我的朋友 Fabian 在他于 斯图加特媒体大学 的学士论文中创建了我,导师是 Walter Kriha、Miško HeveryRyan Carniato。我的榜样还包括 Colin McDonnell,他通过 Zod 对我的 API 设计产生了很大的影响。

反馈

发现了一个错误或者对如何改进我的代码有想法?请提交一个 issue。我们可以一起让这个库变得更好!

许可证

我完全免费,并以 MIT 许可证 授权。但如果你喜欢,可以在 GitHub 上给我一颗星。