benjie是GraphQl和/或PostgreSQL的MIT许可node.js开发人员工具的集体套件的社区资助的维护者。此套房中的一个关键项目是后图,高性能,可自定义的,可扩展的GraphQl架构生成器,主要由Postgresql。
这是从Part 1: Replacing the Foundations开始的“介绍后V5”系列中的第二部分。本周,本杰(Benjie)查看了图后V5的新统一插件和预设系统。
在图后V4中,我们有两种不同类型的插件:schema plugins(原始插件;它们控制GraphQL模式的构建方式:添加类型,字段,参数等)和server plugins(这些添加了后来,这些内容允许您操作,并允许您操作HTTP请求生命周期,添加验证规则,自定义GraphiQL,添加CLI参数以及所有这些好东西)。这两种不同类型的插件以完全不同的方式工作,并以四种不同的方式添加到系统中,其中两个在API模式下添加到了系统中。令人困惑,对
更糟糕的是,随着图后V4的高级,我们与社区一起了解了最佳实践,推荐的设置将发展。但是我们无法更改默认值,因为这将打破所有现有用户的模式。对我来说,主要版本是一件重要的事情 - 每次我想更改默认值时,我们都不应该拥有一个,因此我保留了文档中最新的推荐选项列表,并希望新用户能够使用它们。在5年的过程中,我们设法进行了41次发行后的4.x版本,这一切都没有发生重大变化!但是默认选项的情况并不理想。
最糟糕的是,有那些4 different ways of configuring PostGraphile。您可以使用CLI,在这种情况下,您可以通过CLI标志。如果您开始获得太多的CLI标志,则可以切换到使用RC文件,在传递到库之前,该文件将与解析的CLI标志合并。 RC文件不与库选项一致;它也不与CLI标志一致,因为虽然它是从它们派生的,但它使用了自己的格式,最初是快速调整以实现更大的灵活性,RC文件成为了一个单独的野兽,需要其自己的文档。然后,我们还提供了库的选项,用于您在现有Express/koa/fastify/etcer中使用后盖的中间件。最后,我们只有架构唯一的选项,在使用没有服务器的架构时,该选项是从库选项中删除的。
ugh。这么多记录!
很明显,随着时间的流逝,该系统会随着时间的流逝而演变,并用我可用的时间和时间的drib和drabs进行了修补。好吧,不再!这次我身后有大量赞助,我可以做对了。
很明显我想要一个可以随着时间推移而不会发生重大变化的系统。一个“预设”系统,您可以在其中拉下JAN2023预设或9月2025年的预设,并坚持使用该项目一生的基础。显然,预设需要能够“扩展”其他预设,我们不想填充每个预设中的每个选项。而且,实际上,为什么不这样做,所以用户自己的配置是预设的,无论他们使用CLI,图书馆还是模式?
选择您的味道
Though I've long believed that GraphQL APIs arenât a oneâsizeâfitsâall problem space â hence making PostGraphile so configurable and extensible â through experience with users and sponsors it's clear there是否常见的某些用例类别:
- 有些人直接通过Web揭示其GraphQl API。对于他们来说,至关重要的是,他们的模式小而直截了当,没有任何可能引起性能或安全问题。
- 一些杠杆持续的操作,以确保服务器只能接受预设的查询列表。对于这些方案,图式可能会更大,并且可以揭示更多功能,从而相信前端工程师以确保查询是表现的。
- 有些人以易于查询格式在其组织中内部共享数据。这些用户通常希望尽可能多地暴露Postgres的功率,而无需给予SQL对数据库的实际访问,通常会启用适合大多数面对API的功能。
- 有些人处于原型制作阶段,并希望在做出决定并以后缩小模式范围之前,想看看可能的东西。
以及这些“功能”决策之上,还有“样式”需要考虑。功能强大且可扩展的连接,还是简单而性能的列表?以中继为重点的全局对象标识符或直接数据库主键?从一个空的模式开始,并根据需要添加东西,或者从宽敞的模式开始,然后删除您不需要的内容?
有了这些经验,考虑到这些需求,我开始计划新系统。为了简化用户的内容,只有一种插件。预设将构成其他预设,插件和范围配置选项。这些新的预设和插件将通过新的graphile-config
模块启用,该模块将处理诸如合并预设和订购插件之类的常见问题。插件和预设将包含与系统不同部分有关的“范围”,因此插件可以选择影响模式,服务器或两者兼而有之。并且,如果插件详细介绍了与当前情况无关的范围,例如仅使用架构时的“服务器”范围,那么使用声明性对象而不是使用该系统,这将被忽略先前的程序风格钩。
我有什么选择?
多亏了新系统的声明性和强烈的性质,我已经扩展了具有基于配置的子命令的新的graphile
命令(用于方便实用程序的工具带)。一个命令graphile config print
输出已解决的预设(在预设扩展的所有其他预设中合并后),这对于调试和了解您的预设组合已启用了所有功能非常有用。
另一个命令graphile config options
,输出对您可用的所有配置选项的引用。重要的是,这是根据您在graphile.config.*
文件中导入的模块的特定于您的项目的。通过TypeScript的魔力,它甚至可以从各个模块的TSDOC评论中提取每个选项的文档!此外,输出在降级中,因此您可以将其写入文件以充当项目的配置文档。老实说,我喜欢它!
现在构建了V5的统一插件和预设系统,我对此感到非常满意!实际上,我很高兴,我期待将其与Graphile的其他工具(例如Graphile Worker(我们的Postgres支持的工作队列)和Graphile Migrate(一个基于SQL轻量级的基于SQL的迁移框架),一旦v5)不在稳定。
但是,与v5的其他一些事物相比
下周回来查看第3部分:内省和打字稿;请记住:要获取释放版本的Gostgraphile V5版本,您所要做的就是在任何层次上赞助基础,然后给我们发送电子邮件!在graphile.org/sponsor
上找到更多信息