在 GraphQL 中命名查询和突变有什么意义?

What is the point of naming queries and mutations in GraphQL?

请原谅这个幼稚的问题,但我已经四处寻找答案,但我发现的答案要么含糊不清,要么对我来说毫无意义。以 GraphQL 规范中的这个例子为例:

query getZuckProfile($devicePicSize: Int) {
  user(id: 4) {
    id
    name
    profilePic(size: $devicePicSize)
  }
}

命名此查询有什么意义 getZuckProfile?我看过一些关于包含多个操作的 GraphQL 文档。命名查询会以某种方式影响返回的数据吗?我自己会对此进行测试,但我没有可以轻松进行实验的服务器和数据集。但如果某处文档中的某些内容可以澄清这一点,那就太好了——到目前为止,所有示例都是超级简单的单个查询,或者是已命名但无法解释其原因的查询(除了 "here's a cool thing you can do.") 我从每个请求发送单个匿名查询时没有的命名查询有什么好处?

此外,关于突变,我在规范中看到:

mutation setName {
  setName(name: "Zuck") {
    newName
  }
}

在这种情况下,您指定了 setName 两次。为什么?我知道其中之一是突变的字段名称,需要将其与后端模式匹配,但为什么不呢:

mutation {
  setName(name: "Zuck") {
...

指定同一个名字两次有什么好处?我知道第一个可能是任意的,但为什么不是噪音?我一定是遗漏了一些明显的东西,但到目前为止我发现的一切都没有为我解决。

查询名称在服务器上没有任何意义。它仅用于客户端识别响应(因为您可以在单个请求中发送多个 queries/mutations)。

事实上,如果这是 GraphQL 请求中的唯一对象(并且没有任何参数),您可以只发送一个匿名查询对象:

{
  user(id: 4) {
    id
    name
    profilePic(size: 200)
  }
}

这仅适用于查询,不适用于变更。

编辑:
正如@orta 在下面指出的那样,服务器也可以使用该名称来标识持久查询。但是,这不是 GraphQL 规范的一部分,它只是顶部的自定义实现。

我们使用命名查询,以便可以一致地监视它们,并且我们可以对查询进行持久存储。那里有重复 for query variables 以填补空白。

举个例子:

query getArtwork($id: String!) {
  artwork(id: $id) {
    title
  }
}

你可以运行它对抗Artsy GraphQL API here

优点是每次都是相同的查询,而不是不同的字符串,因为 查询变量 是不同的位。这意味着您可以在这些查询之上构建工具,因为您可以将它们视为不可变的。