Як налаштувати GraphQL API у Craft CMS: від токенів до Next.js
При переході з REST на GraphQL на одному з проєктів ми зіткнулися з N+1 запитами через неправильне налаштування схеми. Після впровадження плагіна craft-graphql-n-plus-1-query-fixer джерело: документація плагіна та оптимізації запитів вдалося знизити TTFB на 30% і покращити LCP на 40%. За кілька років роботи з цією CMS ми налаштували понад 15 проєктів: від блогів до багатомовних порталів. У цій статті розберемо реальні кейси: токени, схеми, інтеграцію з Next.js та оптимізацію запитів.
Чому варто використовувати GraphQL API в Craft CMS?
GraphQL краще REST у 2–3 рази за кількістю запитів, скорочуючи їх до сервера. Замість кількох endpoint ви отримуєте одну точку входу /api і вибираєте лише потрібні поля. Це знижує навантаження на сервер і прискорює рендеринг. Ми заміряли: на проєкті з 5 типами записів LCP зменшився на 40% після переходу з REST на GraphQL. Для сайтів з 10+ типами записів різниця ще помітніша — TTFB падає на 35%. Економія: до $200 на місяць на хостингу завдяки зменшенню запитів.
Як налаштувати схему та токени доступу?
У CP → GraphQL → Schemas створюєте схеми з потрібними правами. Ось порівняння Public та Private схем:
| Параметр | Public Schema | Private Schema |
|---|---|---|
| Авторизація | Не потрібна | Bearer token |
| Доступні елементи | Тільки опубліковані | Включно з чернетками |
| Обмеження | Обмежено рідерами | Повний контроль |
| Використання | Для каталогу, блогу | Для адмін-панелі, прев'ю |
Приклад конфіга:
// config/general.php 'enableGraphqlApi' => true, 'maxGraphqlComplexity' => 500, 'maxGraphqlDepth' => 10, 'maxGraphqlResults' => 100, Токен передається так:
fetch('/api', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${process.env.CRAFT_GRAPHQL_TOKEN}`, }, body: JSON.stringify({ query, variables }), }); Як уникнути N+1 запитів?
N+1 запити — часта проблема при роботі з вкладеними полями. Використовуйте плагін craft-graphql-n-plus-1-query-fixer, який автоматично об'єднує запити до бази даних. Це знижує кількість звернень до БД на 70% — ми перевіряли на проєкті з 10 тис. записів.
Приклади запитів з Inline Fragments
Приклади запитів
Для кожного Entry Type створюється окремий GraphQL-тип за шаблоном {sectionHandle}_{typeHandle}_Entry. Це дозволяє вибирати різні поля для різних типів через Inline Fragments:
query BlogPosts($limit: Int, $offset: Int) { entries( section: "blog", orderBy: "postDate DESC", limit: $limit, offset: $offset, status: "live" ) { id title slug postDate @formatDateTime(format: "d.m.Y") url ... on blog_article_Entry { summary heroImage { url(width: 800) alt width height } categories { title slug } author { fullName photo { url(width: 100, height: 100) } } } } entryCount(section: "blog", status: "live") } Inline Fragments корисні, коли потрібен різний вміст для різних типів записів — наприклад, аудіофайл для подкасту та PDF для прес-релізу.
Як кешувати GraphQL запити на Next.js?
Для інтеграції з Next.js використовуємо fetch з опцією next.revalidate. Це дозволяє використовувати ISR (Incremental Static Regeneration) — сторінки генеруються один раз і оновлюються за розкладом. Без кешування кожен запит ходив би до Craft CMS, збільшуючи TTFB. Ось реалізація:
async function craftQuery<T>(query: string, variables?: Record<string, unknown>, options?: { revalidate?: number }): Promise<T> { const res = await fetch(process.env.CRAFT_GRAPHQL_URL!, { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${process.env.CRAFT_GRAPHQL_TOKEN}`, }, body: JSON.stringify({ query, variables }), next: { revalidate: options?.revalidate ?? 3600 }, }); const { data, errors } = await res.json(); if (errors?.length) throw new Error(errors[0].message); return data; } Порівняємо підходи до кешування:
| Метод | Час перегенерації | Навантаження на сервер |
|---|---|---|
| Без кешу | Кожен запит | Високе |
| ISR (revalidate=3600) | Щогодини | Середнє |
| Redis-кеш | За інвалідацією | Низьке |
Для сайтів з частими оновленнями контенту (новини, блоги) Redis-кеш дає кращу продуктивність, але потребує додаткової інфраструктури.
Якщо потрібні мутації
Вбудований GraphQL лише читає дані. Для мутацій використовуємо кастомний REST endpoint. Це надійніше та простіше у налагодженні. Наприклад, контролер actionSubmitForm приймає POST-дані, створює елемент і повертає JSON з результатом. Детальніше — у документації Craft CMS.
Що входить у налаштування GraphQL API
Ми — команда з 5-річним досвідом роботи з Craft CMS, реалізували понад 15 проєктів. Ми надаємо:
- Конфігурацію схеми та токенів доступу
- Написання запитів під ваш стек (Next.js, Gatsby, SPA)
- Інтеграцію кешування (ISR, Redis)
- Документацію щодо endpoint'ів
- Навчання команди роботі з GraphQL
Терміни: від 1 до 3 днів залежно від кількості Entry Types. Зв'яжіться з нами для оцінки вашого проєкту — ми визначимо оптимальну архітектуру.
Наш досвід: налаштували GraphQL API для понад 15 проєктів на Craft CMS. Гарантуємо зниження часу завантаження сторінок і простоту підтримки. Отримайте консультацію з налаштування GraphQL API під ваші завдання.
Часті помилки та як їх уникнути
-
N+1 запити — GraphQL може породити безліч запитів до БД при вкладених полях. Використовуйте плагін
craft-graphql-n-plus-1-query-fixer. -
Надто висока складність — обмежте
maxGraphqlComplexityдо 500, щоб захиститися від зловмисників. - Неправильні типи — перевірте, що Entry Types правильно замаплені. Імена на кшталт
blog_article_Entryмають збігатися з реальними. - Не забувайте про інтроспекцію схеми — вона дозволяє клієнтам бачити всю структуру, що може бути небажано в продакшні. Налаштуйте резолвери для приховування чутливих полів.
Налаштування GraphQL API з токенами та інтеграцією з Next.js — 1–2 дні. Отримайте консультацію щодо вашого проєкту.







