Уявіть: фронтенд потребує даних з кастомною вкладеністю — статті з авторами, категоріями, тегами та динамічними зонами. Без правильного налаштування 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







