介绍后V5(第2部分):插件和预设
#node #postgres #graphql #postgraphile

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输出已解决的预设(在预设扩展的所有其他预设中合并后),这对于调试和了解您的预设组合已启用了所有功能非常有用。

Screenshot excerpt from a terminal with black background, showing a list of plugins in green, and the configuration of various scopes with the scope name in white and option names below in blue with values in various colours depending on type.

graphile config print的输出可以解决您使用的所有预设,然后按照其版本和描述列出启用插件,然后在每个注册范围中使用的选项。

另一个命令graphile config options,输出对您可用的所有配置选项的引用。重要的是,这是根据您在graphile.config.*文件中导入的模块的特定于您的项目的。通过TypeScript的魔力,它甚至可以从各个模块的TSDOC评论中提取每个选项的文档!此外,输出在降级中,因此您可以将其写入文件以充当项目的配置文档。老实说,我喜欢它!

Screenshot excerpt from a terminal with black background, white text and highlights in bold white, blue and green.

graphile config options命令详细介绍了您在配置文件中可以使用的所有选项。输出以色彩鲜艳的标记样式,包括每个选项的文档以及从Typescript源提取的所有类型,因此您知道它是最新的!

现在构建了V5的统一插件和预设系统,我对此感到非常满意!实际上,我很高兴,我期待将其与Graphile的其他工具(例如Graphile Worker(我们的Postgres支持的工作队列)和Graphile Migrate(一个基于SQL轻量级的基于SQL的迁移框架),一旦v5)不在稳定。

但是,与v5的其他一些事物相比

下周回来查看第3部分:内省和打字稿;请记住:要获取释放版本的Gostgraphile V5版本,您所要做的就是在任何层次上赞助基础,然后给我们发送电子邮件!在graphile.org/sponsor

上找到更多信息