GraphQL 是一种用于 API 的查询语言及为其设计的运行时环境。但随着应用程序的复杂性增加,我们需要时不时地扩展现有 Schema,让它更好地适应新需求。然而,Schema 的扩展并不总是容易的。在本文中,我们将学习一些常见技巧和策略,以帮助您更轻松地进行 GraphQL Schema 扩展。
Schema 扩展概述
在 GraphQL 中,Schema 的构建是通过 Type 和 Field 的组合完成的。类型定义基于需要的领域概念,而字段是在这个过程中根据内容一步步添加的。
Schema 扩展通常需要添加新的 Type 和 Field,同时还可能需要更新现有的 Type 和 Field。解决这个问题的一种方法是使用 GraphQL 的 Schema 语言,我们可以轻松地声明新的 Type 和 Field,然后将它们添加到现有的 Schema 中。这可以通过如下方式实现:
-- -------------------- ---- ------- ---- ----- - -------- ----- ---- - ---- ---- - --- --- ----- ------- - ---- -------- - -------------- ---- ---------------- ------------------ ---- - ----- --------------- - ----- ------ -
其中,我们通过声明两个新的类型 User 和 UserUpdateInput 来扩展现有的 Schema 。我们还添加了一个 updateUser 的 Mutation,它接受一个 UserUpdateInput 作为参数,并返回更新后的 User。
要将这些添加到 Schema 中,我们只需要在原始 Schema 的定义中包含这些新的声明。
在扩展现有类型时使用 Fragments
在某些情况下,我们需要更新现有的类型定义中的字段,例如添加一个新的字段或更改现有字段的类型。在这种情况下,最好使用 GraphQL 的 Fragment 来帮助我们扩展现有类型。
-- -------------------- ---- ------- ---- ---- - --- --- ----- ------- - - --- ---- ----- --- -- ------ ---- ---- - ---- ---- -
在上面的例子中,我们使用了 Fragment 的 extend 操作符。这告诉 GraphQL 我们要扩展现有的 User 类型,并向其添加 age 字段。
使用 Fragment 的另一个好处是可以避免重复代码。例如,如果我们需要在多个地方使用相同的 User 类型定义,我们可以将其定义在一个 Fragment 中,然后在需要的地方引用它。
在 Mutation 中使用 Input 类型
当更新现有类型的字段时,通常会使用 Input 类型。 Input 类型用于将一组输入作为单个参数传递给查询或 Mutation。
input UserInput { name: String! age: Int! } type Mutation { addUser(user: UserInput!): User! }
上面的代码中,我们定义了一个 UserInput 类型来传递需要的用户数据,然后将其用作 Mutation 中 addUser 的参数。这种方法可以大大简化代码,并使我们能够将多个参数打包到一个输入类型中,而不是在 Mutation 中使用多个参数。
在扩展时使用 Union 和 Interface
Union 和 Interface 是 Abstract Types,它们定义了一组共享相同字段的 Object Types。如果我们需要在现有 Schema 中添加新类型,Union 和 Interface 就可以派上用场了。
使用这些 Abstract Types 的好处之一是它们可以在各种情况下共享字段。例如,如果我们要添加一个新的 Object Type(如 Group),它将共享与现有类型相同的字段(如 User 和 Team)。
-- -------------------- ---- ------- --------- ----------- - --- --- ----- ------- - ---- ---- ---------- ----------- - --- --- ----- ------- ------ ------- - ---- ----- ---------- ----------- - --- --- ----- ------- ------ -------- ------ -------- - ---- ---- ---------- ----------- - --- --- ----- ------- ------- ----- -------- -------- -
在上面的代码中,我们使用接口 NamedEntity 来定义一组共享相同字段的 Object Types(User、Group 和 Team)。这将使我们的代码更加灵活、易于维护,并且可以轻松扩展现有 Schema。
结论
在 GraphQL 中,Schema 扩展是一个不可避免的过程,但有许多技术和策略可以帮助我们更轻松地进行这种扩展。本文介绍了一些常见的技术和策略,例如使用 GraphQL 的 Schema 语言、Fragments、Input 类型、Union 和 Interface 等等。使用这些技术和策略,我们可以更好地适应应用程序的需求,并使我们的代码更加优雅、通用和易于维护。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6731be0c0bc820c5823a2eda