Уявіть: фронтенд потребує даних з кастомною вкладеністю — статті з авторами, категоріями, тегами та динамічними зонами. Без правильного налаштування API ви отримуєте N+1 запити, гігантські JSON-відповіді та падіння LCP. Наприклад, типовий запит на отримання статті з автором і категорією без оптимізації генерує 4 запити до БД, що збільшує TTFB до 2 секунд. Після налаштування — один запит і TTFB 200 мс. Ми оптимізували такі сценарії для 30+ проєктів за 6 років роботи. У цьому посібнику розберемо, як налаштувати REST і GraphQL у Strapi, уникнути типових помилок і прискорити API до 10 разів.
Чому варто використовувати REST і GraphQL разом?
REST API у Strapi працює «з коробки» — ідеально для простих списків і стандартних CRUD. GraphQL через плагін підключається за 5 хвилин і вирішує проблему overfetching. GraphQL зменшує об'єм переданих даних до 80% порівняно з REST при складних ієрархіях — це підтверджує наша практика. Ми комбінуємо їх: REST для публічних ендпоінтів, GraphQL для адмінки та внутрішніх інструментів. Оптимізація Strapi REST API та Strapi GraphQL — ключ до швидкодії. Порівняння можливостей — у таблиці.
| Критерій | REST API | GraphQL API |
|---|---|---|
| Готовність | Відразу після запуску | Потребує встановлення плагіна |
| Запити | Багато запитів для зв'язків | Один запит із вкладеними об'єктами |
| Кешування | HTTP-кеш (ETag, CDN) | Складніше (потребує persisted queries) |
| Гнучкість | Фіксована структура відповіді | Клієнт вибирає поля |
| Продуктивність | Легше оптимізувати через DB | Ризик глибокої вкладеності та N+1 |
Як налаштувати REST API?
Формат відповіді Strapi єдиний:
{ "data": { "id": 1, "attributes": { "title": "Article", "slug": "article", "publishedAt": "..." } }, "meta": {} } Для фільтрації, populate, пагінації та сортування використовуйте query-параметри. Приклад запиту з усіма можливостями:
GET /api/articles?filters[status][$eq]=published&filters[price][$gte]=100&populate=author,category&sort[0]=publishedAt:desc&pagination[page]=2&pagination[pageSize]=10&fields[0]=title,slug Підтримуються оператори: $eq, $ne, $lt, $in, $contains, $startsWith, $endsWith, $null, $notNull та їх регістровонезалежні варіанти з суфіксом i. Для зв'язків використовуйте populate — він може бути глибоким, але обмежте глибину через middleware strapi::populate-depth (рекомендуємо maxDepth: 3), щоб уникнути N+1.
Як підключити та кастомізувати GraphQL?
Встановіть плагін @strapi/plugin-graphql і додайте конфігурацію в config/plugins.js (endpoint, ліміти, вимкнення playground у production). Приклад GraphQL запиту на отримання статей із вкладеними даними:
query GetArticles($locale: I18NLocaleCode, $page: Int) { articles( locale: $locale pagination: { page: $page, pageSize: 10 } sort: "publishedAt:desc" filters: { publishedAt: { notNull: true } } ) { data { id attributes { title slug excerpt publishedAt cover { data { attributes { url alternativeText } } } category { data { attributes { name slug } } } } } meta { pagination { total pageCount } } } } Для кастомних резолверів використовуйте extensionService. Створіть поле featuredArticles, що повертає лише обрані статті:
// src/index.ts export default { register({ strapi }) { const extensionService = strapi.plugin('graphql').service('extension') extensionService.use(({ nexus }) => ({ types: [ nexus.extendType({ type: 'Query', definition(t) { t.field('featuredArticles', { type: 'ArticleEntityResponseCollection', resolve: async (_root, _args, context) => { const articles = await strapi.entityService.findMany( 'api::article.article', { filters: { featured: true }, populate: ['cover', 'category'], sort: { publishedAt: 'desc' }, limit: 6, } ) return { data: articles } }, }) }, }), ], })) }, } Як підвищити продуктивність API?
Кешуйте важкі запити з Redis. Наприклад, для featured-articles:
const redis = new Redis(process.env.REDIS_URL) const cachedFeatured = await redis.get('featured-articles') if (cachedFeatured) return JSON.parse(cachedFeatured) const articles = await strapi.entityService.findMany(...) await redis.setex('featured-articles', 300, JSON.stringify(articles)) Типова помилка — N+1 запити при агресивному populate. Якщо використовувати populate=*, Strapi виконує окремі запити до БД для кожного зв'язку. Обмеження глибини через middleware strapi::populate-depth і кешування Redis усувають цю проблему. Добре налаштований GraphQL у Strapi працює до 5 разів швидше за REST для складних запитів із багатьма зв'язками.
Додатково використовуйте Varnish або CDN для кешування відповідей публічних ендпоінтів. Порівняння стратегій кешування — у другій таблиці.
| Стратегія | Коли використовувати | Виграш у швидкості |
|---|---|---|
| Redis | Динамічні дані, часті оновлення | Зниження навантаження на БД у 5–10 разів |
| Varnish | Публічні, рідко змінювані ендпоінти | Прискорення відповідей до 50 мс |
| CDN | Статичні ресурси (зображення, файли) | Близькість до користувача, зниження TTFB |
Як оптимізувати Strapi API: покроковий план
- Аналіз поточних запитів. Використовуйте вбудований логер Strapi або сторонні інструменти (Kibana) для виявлення повільних ендпоінтів.
-
Налаштування populate-depth. Встановіть middleware
strapi::populate-depthзmaxDepth: 3у конфігурації. - Впровадження кешування Redis. Кешуйте результати важких запитів з TTL 300 секунд — це знижує навантаження на БД до 10 разів.
- Перехід на GraphQL для складних зв'язків. Якщо фронтенд запитує вкладені дані, використовуйте GraphQL — він зменшує об'єм переданих даних до 80%.
- Моніторинг та ітерація. Регулярно перевіряйте продуктивність через Strapi audit logs і коригуйте налаштування.
Що входить у налаштування API під ключ?
- конфігурація REST та/або GraphQL з урахуванням навантаження;
- кастомні резолвери та мідлвари;
- оптимізація populate та кешування (Redis, Varnish);
- налаштування прав доступу та ролей;
- документація (Postman-колекція, опис ендпоінтів);
- навчання команди (1–2 сесії);
- підтримка 2 тижні після здачі.
Строки та вартість
Налаштування GraphQL плагіна, кастомних резолверів та оптимізація запитів — від 2 до 5 днів. Вартість налаштування API від $500 до $2000 залежно від складності. Правильне налаштування кешування може скоротити витрати на серверні потужності до 40%, а середня економія бюджету на інфраструктуру замовників складає 30%. Маємо 6-річний досвід, понад 30 успішних проектів, надаємо гарантію на налаштування — 30 днів безкоштовної підтримки. Замовте консультацію, щоб обговорити деталі вашого API. Отримайте консультацію — зв'яжіться з нами.
Джерело: офіційна документація Strapi по GraphQL — https://docs.strapi.io/dev-docs/plugins/graphql







