graphql,将大型查询拆分为小型查询

时间:2018-07-13 06:54:57

标签: graphql graphql-js github-graphql

我正在使用https://developer.github.com/v4/

我有这样一个庞大的查询:

query ($login: String!, $first: Int, $after: String) {
  user (login: $login){
    avatarUrl
    login
    name,
    followers(first: $first, after:$after) { 
      edges{
        cursor
        node{
          id
          name
          login
          avatarUrl
        }
      }
      totalCount
    },
    repositories(first: $first) {
      edges{
        cursor
        node{
          id
          name
        }
      }
      totalCount
    }
  }
}

但是我认为从服务器查询大量数据是很糟糕的。

我有followersrepositories页。因此,我认为将大型查询拆分为小型查询会更好。

以下是一些小的查询:

关注者查询:

query($login: String!, $first: Int, $after: String) {
    user(login: $login) {
      followers(first: $first, after: $after) {
        edges {
          cursor
          node {
            id
            name
            login
            avatarUrl
          }
        }
        totalCount
      }
    }
  }

存储库查询:

query($login: String!, $first: Int, $after: String) {
    user(login: $login) {
      repositories(first: $first, after: $after) {
        nodes {
          id
          name
        }
        totalCount
      }
    }
  }

用户查询:

query($login: String!, $first: Int) {
    user(login: $login) {
      avatarUrl
      login
      name
    }
  }

我正确吗?是否有必要这样做?这种情况下的最佳做法是什么?是否有任何文档可以教人们如何处理或告诉人们最佳实践?

2 个答案:

答案 0 :(得分:0)

我找到了有关query splitting的阿波罗文档:https://www.apollographql.com/docs/angular/recipes/query-splitting.html

答案 1 :(得分:0)

您可以将查询吐到Fragments中,这样,您仍然只会触发一个请求,并且"queries"较小。像这样:

关注者片段:

fragment followers on User {
    followers(first: $first, after: $after) { 
      edges{
        cursor
        node{
          id
          name
          login
          avatarUrl
        }
      }
      totalCount
    },
}

存储库片段:

fragment repositories on User {
  repositories(first: $first) {
      edges{
        cursor
        node{
          id
          name
        }
      }
      totalCount
    }
}

在查询中将它们全部放在一起:

query ($login: String!, $first: Int, $after: String) {
  user (login: $login){
    avatarUrl
    login
    name
    ...followers
    ...repositories
  }
}