Я слишком часто видел, как компоновка GraphQL на стороне клиента выполняется неправильно. Как оказалось, на самом деле в GraphQL встроен тип fragment, который значительно упрощает работу с композицией типов. В этой статье я приведу примеры на Javascript, как если бы мы писали клиентский код на стороне браузера.
Композиция без фрагментов
Вот пример того, как мы могли бы повторно использовать строку GraphQL с традиционной интерполяцией:
const DAYS = `
monday tuesday wednesday thursday friday saturday sunday
`
const GET_STORE_INFO_QUERY = `
query {
getStoreInfo {
schedule {
${DAYS}
}
}
}
`
Это, безусловно, сработает, если мы просто попытаемся использовать его для вызова сервера GraphQL, но в конечном итоге мы столкнемся с некоторыми странными проблемами, если попытаемся использовать какие-либо инструменты статического анализа, такие как graphql-inspector (подробнее об этом позже).
Композиция с фрагментами
Вот тот же пример выше, но с использованием фрагментов:
const DAYS_FRAGMENT = `
fragment days on Schedule {
monday tuesday wednesday thursday friday saturday sunday
}
`
const GET_STORE_INFO_QUERY = `
${DAYS_FRAGMENT}
query {
getStoreInfo {
schedule {
...days
}
}
}
`
Да, мы по-прежнему используем литералы шаблонов для добавления фрагментов в строку запроса, но это абсолютно правильно и то, как предполагается использовать фрагменты.
Если вы хотите поэкспериментировать с фрагментами на игровой площадке GraphQL, вы можете просто воссоздать выражение в его составной форме:
fragment days on Schedule {
monday tuesday wednesday thursday friday saturday sunday
}
query {
getStoreInfo {
schedule {
...days
}
}
}
Фрагменты с переменными
Вы даже можете использовать переменные с фрагментами, как и другие типы.
fragment days on Schedule {
monday tuesday wednesday thursday friday saturday sunday
}
fragment employees on StoreInfo {
employees(status: $status) {
id
name
}
}
query GetStoreInfo($status: EmployeeStatus = ACTIVE) {
getStoreInfo {
schedule {
...days
}
...employees
}
}
Как вы можете видеть в этом примере, фрагменты могут быть запросами или любой другой структурой GraphQL.
Фрагменты — это канонический механизм, предоставляемый GraphQL для составления типов чистыми, пригодными для повторного использования способами. Они дают нам возможность разбивать сложные запросы, сокращать избыточный код и по-прежнему использовать мощные инструменты статического анализа в наших проектах. В следующей статье я продемонстрирую один из таких инструментов, graphql-inspector который может избавить вас от развертывания неработающих запросов в рабочей среде.