Gato GraphQL vs WPGraphQL
Сравнение Gato GraphQL и WPGraphQL


Если вам нужно просто создать headless-сайт на WordPress и развернуть его как статический, и вы сейчас используете WPGraphQL, переход на Gato GraphQL не даст никакой разницы.
В остальных случаях переход на Gato GraphQL даёт множество преимуществ. Ниже перечислены возможности Gato GraphQL + всех расширений, которых нет в WPGraphQL.
Сводная таблица
| Функция | Gato GraphQL | WPGraphQL |
|---|---|---|
| Проблема N+1 | Не возникает благодаря архитектурному решению | Может возникнуть, если не обработать; разработчик должен об этом помнить |
| Безопасность: отключение endpoint | Можно полностью отключить единый endpoint с помощью persisted queries (PRO) | Не предусмотрено |
| Контроль доступа | Валидация поле за полем с ролями/capabilities/IP через UI (PRO) | Не на уровне полей, менее гранулярно |
| Управление кешем | max-age рассчитывается автоматически для queries (PRO) | Автоматического управления кешем нет |
| Пользовательские endpoints | Несколько endpoints, защищённых паролем/настраиваемых; поддерживается иерархия endpoints (PRO) | Один endpoint, ограниченная настройка |
| Массовые обновления и поиск/замена | Массовое удаление, назначение тегов, замена (с regex) через GraphQL (PRO) | Не предусмотрено |
| Пользовательские/экспериментальные возможности GraphQL | Вложенные мутации, namespace схемы, oneOf input object | В основном стандартная спецификация GraphQL |
| Multiple Query Execution (компонуемость) | Несколько queries в одном документе, совместное использование состояния через @export | Пакетные queries (несколько за запрос), но без общего состояния |
| Внутренние/приватные endpoints | Приватный endpoint только для backend/PHP, не доступный пользователям (PRO) | Не предусмотрено |
| Расширенная мутация данных | Получение, изменение и сохранение данных в одном документе (PRO) | Не поддерживается |
| Синхронизация и распространение контента | Импорт/экспорт через GraphQL, RSS, CSV, REST API (PRO) | Не предусмотрено |
| Интеграция с веб-сервисами | Исходящие/входящие вызовы API и вебхуки (PRO) | Не поддерживается |
| Автоматизация (хуки/рабочие процессы) | GraphQL как автоматизация рабочих процессов (PRO/редактор UI) | Не предусмотрено |
| Удобство использования (интеграция UI) | Широкие возможности UI для создания/администрирования GraphQL queries | Более базовый интерфейс администратора |
| Batching/компонуемость | Компоновка полей/директив, повторно используемая логика resolver (PRO) | Не поддерживается |
| Multiple Query Execution | Поддерживается, с общим состоянием и зависимостями | Поддерживается, без общего состояния |
| Стандартное headless/статическое использование | Оба одинаково пригодны | Оба одинаково пригодны |
Обозначения:
- (PRO): Функция требует платной/pro версии или расширений Gato GraphQL.
Краткое резюме:
- Gato GraphQL предлагает значительно больше возможностей для продвинутой разработки, автоматизации и безопасности
- Оба плагина равнозначны для базовой статической/headless установки WordPress
- Расширенные функции Gato GraphQL сосредоточены на:
- Детальном контроле
- Автоматизации рабочих процессов
- Богатых интеграциях
- Современных экспериментальных возможностях GraphQL
Удобство разработки
Разработчикам не нужно беспокоиться о проблеме queries «n+1»: благодаря архитектурному решению GraphQL-сервера она просто не возникает.
Безопасность
При использовании persisted queries для предоставления предопределённых данных можно полностью отключить единый endpoint GraphQL, чтобы он был недоступен даже аутентифицированным пользователям.

Контроль доступа
Можно настроить доступ к данным только для авторизованных пользователей, пользователей с определённой ролью или capability, или посетителей из определённого диапазона IP, на уровне отдельных полей (PRO).

Управление кешем
При кешировании ответа GraphQL с помощью стандартного HTTP-кеширования заголовок max-age рассчитывается автоматически на основе всех полей, присутствующих в GraphQL query (PRO).

Настройка и управление endpoints
Можно создавать несколько пользовательских endpoints, каждый из которых настроен для конкретного клиента или приложения, защитив их паролем.
Им можно назначать пользовательские категории и задавать иерархию (например, /graphql/customers/some-customer и /graphql/customers/another-customer).

Массовые обновления
Можно выполнять массовые обновления. Например, удалить все комментарии на сайте или назначить тег или категорию всем записям.
Также можно искать и заменять строку в сотнях записей — например, заменить старый домен новым, в том числе с использованием regex (PRO).
Пользовательские возможности GraphQL
Вы получите доступ к новым возможностям GraphQL, предложенным для спецификации, но ещё не выпущенным, включая вложенные мутации, namespace схемы и Input Object «oneOf».

Multiple Query Execution
WPGraphQL позволяет выполнять пакетные queries, при которых несколько GraphQL queries разрешаются в рамках одного HTTP-запроса.
Gato GraphQL предоставляет Multiple Query Execution, при котором один документ GraphQL может выполнять несколько операций.
Multiple Query Execution — это улучшение по сравнению с пакетным выполнением queries, поскольку операции могут обмениваться состоянием с помощью директивы @export.
Например, чтобы продублировать запись, операция query получает данные записи и передаёт их операции mutation, которая создаёт новую запись на их основе:
query GetPostAndExportData($postId: ID!)
{
post(by: { id: $postId }, status: any) {
author {
id @export(as: "authorID")
}
categories {
id @export(as: "categoryIDs", type: LIST)
}
rawContent @export(as: "rawContent")
rawExcerpt @export(as: "excerpt")
featuredImage {
id @export(as: "featuredImageID")
}
tags {
id @export(as: "tagIDs", type: LIST)
}
rawTitle @export(as: "title")
}
}
mutation DuplicatePost
@depends(on: "GetPostAndExportData")
{
createPost(input: {
status: draft,
authorBy: {
id: $authorID
},
categoriesBy: {
ids: $categoryIDs
},
contentAs: {
html: $rawContent
},
excerpt: $excerpt
featuredImageBy: {
id: $featuredImageID
},
tagsBy: {
ids: $tagIDs
},
title: $title
}) {
postID
}
}Компонуемость
Вы сможете компоновать поля, при этом значение одного поля может передаваться как входные данные другого поля в той же query, что позволяет базовому набору resolver-ов полей охватить неограниченное количество сценариев использования (PRO).
Например, вместо создания поля Post.hasExcerpt можно применить поле _notEmpty к Post.excerpt и получить то же значение:
query {
post(by: { id: 1 }) {
excerpt
hasExcerpt: _notEmpty(value: $__excerpt)
}
}Аналогично, можно компоновать директивы, чтобы директива применялась к внутреннему свойству значения поля.
Например, следующая query переводит названия категорий записи на другой язык:
query {
post(by: { id: 1 }) {
title
categoryNames
frenchCategoryNames: categoryNames
@underEachArrayItem
@strTranslate(
from: "en",
to: "fr"
)
}
}Доступность GraphQL-сервера
Можно предоставлять приватные endpoints для блоков Gutenberg. А также обращаться к приватному GraphQL-серверу, чтобы получать данные для приложения через PHP-код, не создавая публичных endpoints (PRO).
Универсальность при мутации данных
Можно использовать GraphQL для получения, изменения и повторного сохранения контента сайта — всё в рамках одного документа GraphQL (PRO).
Например, можно получить все блоки Gutenberg в записи, извлечь их свойства, перевести эти строки через Google Translate API, вставить строки обратно в блок и сохранить запись.
Синхронизация и распространение контента
Можно использовать GraphQL для импорта записей с другого сайта WordPress, из RSS-ленты, из CSV или из любого REST или GraphQL API (PRO).
Можно экспортировать контент на другой сайт WordPress и сохранять его в формате JSON и CSV (PRO).
Взаимодействие с веб-сервисами
Можно вызывать API любого внешнего сервиса через HTTP-клиент (PRO). Например, подписывать пользователей WordPress на список рассылки Mailchimp.
А также получать и обрабатывать входящие данные от любого сервиса через выделенный вебхук (PRO). Например, можно перехватывать email-адреса подписчиков, зарегистрированных на sandbox-сайте InstaWP, и автоматически отправлять их в Mailchimp.
Автоматизация
Можно использовать GraphQL для автоматизации задач и рабочих процессов с контентом (PRO).
Например, при создании новой записи (событие через хук draft_post) можно выполнить persisted query, которая проверяет, есть ли у записи миниатюра, и если нет — генерирует изображение, вызывая Stable Diffusion API, сжимает его через TinyPng и вставляет в качестве избранного изображения записи.

Удобство использования
Все эти дополнительные сценарии использования можно реализовать прямо в wp-admin, задавая GraphQL query через пользовательский интерфейс, без необходимости разворачивать PHP-код.
