通过仅包含具有值的字段来优化 GraphQL 查询?

Optimizing GraphQL queries by including fields only if they hold a value?

我完全不知道这是否是个好主意,真的很糟糕,所以这就是我想知道的。

假设我有一个 graphql 服务器,它发回这样的东西:

[

    {
      name: "John"
      age: 55
      isSingle: false
      hasChildren: false
      lovesMusic: false #imagine more fields like these
    {,
     # ...loads of records of the same format here

]

假设文件很大并且有很多记录:将它从错误的值中删除并且发回一些东西不是一个好主意吗每当 isSingle / hasChildren / lovesMusic 为真时,为了节省带宽?或者这是一个坏主意,让一切都容易出错?

所以在这个例子中,我只是发回:

[

    {
      name: "John"
      age: 55 
    {,
    ...

]

我很担心,因为我的查询返回了很大的 graphql 对象,其中很多只是未填写的字段,因此我的前端不需要。

根据我的理解,GraphQL 的全部意义在于准确接收指定的类型和字段集 - 不多也不少。

使用某些中间件更改结果或删除包含 0nullfalseundefined 的字段将违反 Graphql 规范。如果你无论如何都要违反某种约定,那么使用它是没有意义的。

然而,对于性能和带宽优化,有一些选项需要考虑:

使用较短的名称

您可以在 GraphQL 架构中使用较短的字段名称。你甚至可以想出某种你自己的压缩算法。例如,您可以用字符替换逻辑名称,然后在前端将它们映射回常规名称。

{
     name: "John"
     age: 55
     isSingle: false
     hasChildren: false
     lovesMusic: false
{

会变成这样:

{
     n: "John"
     a: 55
     s: f
     hC: f
     lM: f
}

然后您可以将字段名称和值映射回前端,当然会牺牲一些性能。您只需要在 javascript 中有一些字典对象,它将较短的字段名称存储为键,将较长的字段名称存储为值:

const adict = {
  "hC": "hasChildren",
  "lM": "lovesMusic",
  "n": "name",
  ...
}

虽然这种方法会缩小您的数据并为您节省一些带宽,但它不是应用程序方面的最佳做法。我认为它会以某种方式降低您的代码的灵活性和可读性。

外部图书馆

有很多外部库可以帮助您减少数据负载。最受欢迎的是 Message Pack and Protocol buffers。这些都是非常高效且巧妙构建的技术,但研究它们并将它们集成到您的解决方案中可能需要一些时间。