为什么JOI比AJV更受欢迎?

43
我正在决定一种验证库,可用于客户端和服务器端的验证。我一直在比较 JOI (+ joi-browser) 和 AJV。
据我所知,JOI和AJV可以完成相同的事情。AJV甚至可以执行异步验证,而JOI无法。似乎AJV也会验证以标准格式编写的JSON模式,这很方便,但不像JOI那样开发者友好。 JOI的星级和贡献者数量是AJV的两倍以上。
为什么JOI比AJV受欢迎?
1个回答

111
重要的区别是,AJV 是 JSON Schema 验证器,Joi 是 JavaScript 验证器。JSON Schema 是跨平台的,而 Joi 只在 JavaScript 中有效。所以,这不是 AJV 和 Joi 之间的选择,而是 JSON Schema 和 Joi 之间的选择。
每种方法都有其权衡,因此您的选择很大程度上取决于您的特定情况。
AJV/JSON Schema
从 JSON Schema 中获得的重大收益是它是跨平台的。JSON Schema 验证器实现存在于每种主要编程语言中。无论您选择哪种语言,都可以在前端和后端使用相同的 JSON Schema,并获得一致的验证结果。一次编写,随处验证。
缺点是,由于它是跨平台的,它在能力方面也有些局限性。它被故意保持足够简单,以便在任何编程语言中实现它不会太困难。因为 JSON Schema 不是一个完整的编程语言,所以它在功能上有限制。
如果您在后端使用其他语言或您的应用程序是可由任何数量的语言中的任何数量的应用程序使用的公共 API,则可能会选择 AJV/JSON Schema。
Joi
Joi 的最大优势是其易用性。它易于使用,易于扩展,并且具有 JavaScript 的全部功能。

缺点是,如果你想要在前端和后端复用验证逻辑,那么你只能在后端使用node语言。

如果你在前端和后端都使用JavaScript,并且不预计需要支持非JavaScript客户端,那么你可以选择Joi。尽管这种情况比较狭窄,但如果正是你的情况,你可能会从Joi中获得更多,而不是AJV/JSON Schema。

流行度

Github星数并不能很好地衡量受欢迎程度。如果你查看npm每日下载量,你会看到一个非常不同的故事(AJV:1890万,Joi:220万)。JSON Schema由于跨平台,因此被广泛使用。AJV只是一个语言中的一种实现。但是,如果你的开发堆栈符合Joi的特定领域,它可以成为与JSON Schema同样甚至更好的选择。


@Jason 谢谢,非常有启发性!你提到 AJV/JSON Schema 有其局限性,能否澄清一下你的意思?据我所知,在针对模式验证对象时,AJV(JSON Schema) 和 Joi(将 JSON 模式转换为 Joi 模式)都可以实现许多相同的功能。由于 AJV 和 Joi 都具备创建自定义验证器、执行条件和嵌套验证以及所有标准验证功能的能力。 - tkalis
@Jason 当你说“如果你使用的不是JavaScript,你可能会选择AJV / JSON Schema”,AJV是JavaScript的JSON模式验证器,所以我认为这个说法是误导性的。我想你指的是能够验证任何语言中的json模式的能力。这正确吗? - tkalis
3
回复:JSON Schema 的限制。AJV 通过自定义功能和插件解决了大部分这些限制,但是当您使用这些自定义功能时,您会失去与其他 JSON Schema 库的互操作性,从而失去选择 JSON Schema 的初衷。 - Jason Desrosiers
16
我将为您提供三个关于 JSON Schema 做不到的事情的例子。(1) 您无法将一个值与另一个值进行比较。您无法强制要求 #/minWeight 小于 #/maxWeight。(2) 您无法比较日期。JSON Schema 只能识别 JSON 类型,而这不包括日期。日期被表示为字符串。因此,您无法强制进行最小或最大日期检查。(3) 您无法引用外部源,例如数据库或 Web 服务。在社交媒体应用中,当您添加好友到您的网络时,您可能想强制执行已添加好友实际上存在于您的系统中。 - Jason Desrosiers
回复:“误导性陈述”。抱歉,那确实令人困惑。是的,我指的是能够在任何语言中验证JSON模式。 - Jason Desrosiers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接