GraphQL 是一个非常强大的数据查询语言,通过定义一个 GraphQL Schema 可以实现前后端相对独立,灵活的数据交互。而一个优秀的 GraphQL Schema,不仅可以提高查询效率,还可以提高开发效率,减少沟通成本。本文将基于经验总结或讲解 GraphQL Schema 设计的优化技巧及最佳实践。
1. 抽象类型
在 GraphQL Schema 中使用抽象类型可以使 schema 更加灵活和复用性更强。GraphQL 通过 interface
和 union
类型来支持抽象类型,其中 interface
类型定义了一个共同的接口,而 union
则定义了一个值可以属于多个类型的联合。
举个例子,某个 app 需要实现一个领域驱动模型,要实现一个 Animal
接口类型,并继承多个子类型:
-- -------------------- ---- ------- --------- ------ - --- --- ----- ------- ---- ---- - ---- --- ---------- ------ - --- --- ----- ------- ---- ---- ------ ------- - ---- --- ---------- ------ - --- --- ----- ------- ---- ---- ------ ------- -
这样定义之后,我们可以非常方便地查询或使用在接口类型上定义的方法或属性:
-- -------------------- ---- ------- - ---------- ---- - -- ---- --- --- -- --- - ----- - --- -- --- - ----- - - -
这样既提高了查询效率,也实现了-schema的复用和扩展,并避免了一些潜在的性能问题。
2. 引用类型
在 GraphQL Schema 中,我们可能会经常遇到需要引用其他类型的情况。而使用 GraphQL 中的引用类型则是处理这类情况的最佳实践。
-- -------------------- ---- ------- ---- ---- - --- --- ------ ------ ------- ---- - ---- ---- - --- --- ----- ------ ------ ------ -
其中,在定义 Post 类型时,可以通过 author: User
引用 User
类型。这样默认会通过 User
类型的 id
字段来找到对应的 User
对象,非常方便且直观。
3. 最小化无用查询
GraphQL 是通过查询语句定义出需要返回的数据结构的。而一个查询语句中如果包含了多余的字段或属性,则可能会增加无用的计算或网络请求。因此最佳实践中要尽量最小化无用查询。
-- -------------------- ---- ------- ---- ---- - --- -- ------ ------ ------- ------ ----------- ----------- - ---- --------- - --- -- ----- ------ -------- ------ - ---- ------ - --- -- ----- ------ ------ ------ ------ ------ -
如上定义的 GraphQL Schema 中,如果不需要查询 Publisher
类型的信息,则可以使用如下的查询语句:
-- -------------------- ---- ------- - ----- - -- ----- ------ - ---- ----- - - -
这样就能最小化无用查询并提高效率。
4. 分页
当我们需要处理大量数据时,分页是一种非常常见且有效的手段。而在 GraphQL Schema 中,分页可以通过 Connection
/Edge
类型来实现。
-- -------------------- ---- ------- ---- ---- - --- --- ------ ------- ------- ------- - ---- ------ - --- --- ----- ------- ------ ------- ------------ ---- ------ -------- -------------------- - ---- -------------------- - --------- --------- ------ ----------------- - ---- -------------- - ------- ------- ----- ----- - ---- -------- - ------------ ------ ---------- ------ ------------ -------- ---------------- -------- -
其中定义了 AuthorBookConnection
和 AuthorBookEdge
,用来返回分页后的数据。这样通过 first
和 after
的参数就能实现分页的效果。
5. 关联类型
在 GraphQL Schema 中,我们常常会有关联类型的情况,比如 Order
关联到 Customer
,Product
关联到 Category
等。而 GraphQL Schema 中提供了 @relation
来支持关联类型的定义:
-- -------------------- ---- ------- ---- ----- - --- --- --------- -------- --------- --------- -------------- - ---- -------- - --- --- ----- ------- ------ ------- - ---- ------------ - --- --- ------ ----- --------------- ---------------- -------- ------- --------- --------- ---- - ---- ------- - --- --- ----- ------- --------- -------- --------- - ---- -------- - --- --- ----- ------- -
通过 @relation
的定义,我们可以实现关联类型的查询或联表操作。
结语
这篇文章讲解了 GraphQL Schema 的一些优化技巧和最佳实践,其中包括了抽象类型、引用类型、最小化无用查询、分页以及关联类型的定义。我们相信这些技巧能够帮助你在设计 GraphQL Schema 方面更加得心应手,并提高开发效率。如果您还有其他的技巧或实践,也欢迎分享给我们。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/649c25fb48841e98948f14db