2

进行以下查询:

import gql from "graphql-tag";

const FOO = gql` {
  foo (id: "12") {
    id
    qux {
      id
    }
  }
}

const BAR = gql` {
  BAR (id: "12") {
    id
    qux {
      id
    }
  }
}

如果我们可以保持代码 DRY 并定义qux一次,那就太好了。

我看到两个解决方案:

  1. 字符串插值,qux取出查询并将其定义为字符串。这是GitHub 要点
  2. 使用片段

但是使用#2 有一个警告:

如果您在联合和接口上使用片段,则需要使用 IntrospectionFragmentMatcher

使用碎片有什么好处?

4

1 回答 1

2

Apollo 文档在那里有点误导。使用接口或联合将要求您提供一个 IntrospectionFragmentMatcher 句点。那是因为内联片段仍然是片段。如果您要查询联合或接口字段,您将不得不使用每个具体类型的片段,内联或其他。所以我不会真的认为这是使用片段的“警告”。

出于以下几个原因,您通常应该使用片段:

  • 习俗。任何已经熟悉 GraphQL 的人都可以查看您的代码并立即掌握发生了什么。任何为您的项目做出贡献的人都可以更轻松地做到这一点。
  • 附加验证。片段需要“开启”条件,以确保它们在正确的位置使用。使用带有错误字段的片段将产生比简单地请求错误字段更能提供信息的错误消息(请参阅此处的示例)。
  • 更好的DX。使用 webpack 加载器或 babel 插件,您可以将查询保存在单独的文件中并直接导入它们,而无需graphql-tag到处导入。大多数 IDE 支持以这种方式存储的 GraphQL 文档的语法高亮和其他好东西。

使用字符串插值的主要好处是能够轻松地有条件地包含或排除字段。通过使用@skipand@include指令仍然可以使用片段,但要冗长得多。

于 2019-11-13T20:27:10.853 回答