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
    }
  }
}

Но я считаю, что запрашивать огромные данные с сервера - это плохо.

У меня есть страницы followers и repositories. Поэтому я думаю, что лучше разделить этот огромный запрос на небольшие запросы.

Вот небольшие запросы:

запрос подписчиков:

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
    }
  }

Правильно ли я? Это нужно делать? Как лучше всего поступить в этой ситуации? Есть ли какая-нибудь документация для обучения людей тому, как с этим справляться, или рассказывающая о лучших практиках?

В чем проблема "огромного" запроса (на самом деле я думаю, что он довольно маленький)? Вот почему вообще был изобретен GraphQL. Также Github будет рад, что вы получите нужные данные - и только те, которые вам нужны - в одном запросе. Как описано в документации Apollo, есть несколько причин для разделения запросов (например, для ускорения пользовательского интерфейса), но особенно при взаимодействии сервера с сервером они возникают очень редко. Пожалуйста, прежде всего пересмотрите возможность их разделения.

Herku 15.07.2018 22:08

Вы когда-нибудь находили для этого подходящее решение? Я не понимаю, как фрагменты помогают без связанных меньших запросов для повторного извлечения этой фрагментированной части более крупного запроса.

Jens Bodal 15.12.2020 04:09
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Что такое Apollo Client и зачем он нужен?
Что такое Apollo Client и зачем он нужен?
Apollo Client - это полнофункциональный клиент GraphQL для JavaScript-приложений, который упрощает получение, управление и обновление данных в...
3
2
1 638
1

Ответы 1

Вы можете поместить свои запросы в Фрагменты, и тогда вы все равно будете запускать только один запрос и иметь меньший "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
  }
}

Другие вопросы по теме