Інтеграція Directus з React та Next.js: як уникнути помилок та прискорити сайт
Проблеми інтеграції Directus з React та Next.js
Новинний портал із Directus втрачав відвідувачів через LCP 3.2 секунди та TTFB 1.1 секунди. Причина — stale-кеш та N+1 запити. Правильна інтеграція Directus з React/Next.js через SDK та ISR вирішує ці проблеми: hydration mismatch зникає, LCP падає нижче 0.5 с. Досвід команди — понад 50 інтеграцій CMS з фронтендом за 10 років. Ми налаштовуємо SDK, ISR та real-time за 2–5 днів, типізація колекцій скорочує помилки на 30% ще до компіляції. Замовте консультацію — ми проаналізуємо вашу архітектуру та запропонуємо оптимальне рішення. Наша команда має 10+ років досвіду в інтеграції CMS та 5 років спеціалізації на Directus, виконали понад 50 успішних інтеграцій.
Які проблеми вирішуємо?
- Stale-кеш: без ISR та вебхуків дані на фронтенді застарівають. Рішення — налаштувати on-demand ревалідацію через вебхуки Directus. Офіційна документація зазначає: SDK надає повністю типізований клієнт для REST та GraphQL.
- N+1 запити: при відображенні списків із вкладеними даними кількість запитів зростає. SDK підтримує глибокі зв'язки, об'єднуючи все в один запит, що знижує навантаження на сервер.
- Відсутність типів: ручні інтерфейси не синхронізуються зі схемою бекенду. Генерація типів зі схеми Directus автоматично оновлює їх при зміні колекцій, забезпечуючи code-first development.
Як Directus SDK прискорює розробку?
Directus SDK — офіційний TypeScript-клієнт, який дає автодоповнення та перевірку типів на етапі написання коду. Замість ручного опису fetch-запитів ви отримуєте єдиний інтерфейс для REST та GraphQL. SDK скорочує час розробки в 3 рази порівняно з кастомною REST-обгорткою. Крім того, він спрощує real-time інтеграцію в 5 разів швидше, ніж реалізація через WebSocket вручну. Наша команда з 10+ роками досвіду виконала більше 50 інтеграцій CMS з фронтендом, і Directus SDK незмінно показує best practices. Докладніше — Directus SDK documentation.
Чому ISR з вебхуками — оптимальний вибір для контентних сайтів?
Incremental Static Regeneration — must-have для контентних сайтів. Без нього кожен запит до статті може ходити в базу. Ми налаштовуємо ISR через revalidate в Next.js та вебхук Directus: при оновленні запису відправляється POST на /api/revalidate, і кеш скидається тільки для потрібної сторінки. Це дає TTFB нижче 100 мс та свіжі дані. ISR з вебхуками за продуктивністю виграє у SSR в 50 разів при повторних відвідуваннях (TTFB 20 мс проти 1 секунди). Порівняйте стратегії рендерингу в таблиці нижче.
Порівняльний аналіз
Підходи до інтеграції
| Підхід | Продуктивність | Складність | Типізація | Real-time |
|---|---|---|---|---|
| REST API (fetch) | Середня (TTFB ~200ms) | Низька | Ручна | Ні |
| GraphQL | Висока (один запит) | Середня | Вимагає кодогенерації | Ні |
| Directus SDK | Висока (свій адаптер) | Низька | Автоматична | Так (WebSocket) |
SDK перемагає за сукупністю факторів. Ми впроваджуємо його в проекти з React, Vue та Next.js.
Стратегії рендерингу
| Стратегія | TTFB | LCP | Свіжість даних |
|---|---|---|---|
| SSR | 200ms | 1.5s | Актуальні |
| SSG | 20ms | 0.5s | Вимагає редеплою |
| ISR | 20ms | 0.5s | Актуальні (інвалідація) |
| ISR + Webhook | 20ms | 0.5s | Миттєво |
ISR з вебхуками дає TTFB як у статики та свіжість як у SSR.
Кейс: інтернет-магазин
Наш клієнт — мережа електроніки з каталогом 5000 товарів. Проблеми: ціни та залишки оновлювалися раз на добу, що призводило до конфліктів з реальним складом. Ми підключили Directus як бекенд, а фронтенд на Next.js 14.
Відзначимо: що зробили:
- Встановили @directus/sdk з типізацією схеми.
- Налаштували ISR на категоріях товарів (revalidate: 60 сек).
- Прив'язали вебхук Directus до on-demand ревалідації — як тільки менеджер змінював ціну, сторінка товару оновлювалася миттєво.
- Додали realtime-підписку на залишки: при покупці кількість на складі зменшувалася в реальному часі.
Результат: швидкість завантаження сторінок зросла на 40%, помилки із замовленнями пішли повністю. Економія бюджету на серверну інфраструктуру склала більше $200 на місяць, а на розробці — близько $5,000 порівняно з кастомною реалізацією. Отримайте аналогічний результат для вашого проекту — замовте консультацію.
Процес роботи, терміни та що входить у результат
- Аналітика — вивчаємо схему Directus, визначаємо колекції та зв'язки.
- Проектування — створюємо TypeScript-типи, вибираємо стратегію (SSR, ISR, SSG).
- Реалізація — пишемо SDK-клієнт, хуки, серверні компоненти.
- Тестування — перевіряємо на bottleneck-запитах, імітуємо навантаження.
- Деплой — налаштовуємо CI/CD, вебхуки, моніторинг TTFB.
Відзначимо: що входить у результат:
- Документація по SDK та архітектурі інтеграції.
- Навчання команди (2–4 години).
- Підтримка протягом 30 днів після передачі.
- Гарантія якості: ми надаємо 30-денну гарантію на інтеграцію.
Терміни: базова інтеграція (SDK, типи, серверні запити, вебхуки) — від 2 до 3 днів. Розширена (realtime, кастомні колекції, пагінація) — від 5 до 7 днів. Вартість починається від $2,000, точна оцінка розраховується індивідуально залежно від обсягу кастомних колекцій та складності realtime. Зв'яжіться з нами для обговорення вашого проекту — ми підготуємо точну оцінку.
Типові помилки при інтеграції Directus
- Пропуск налаштування ревалідації — кеш застаріває, користувачі бачать старі дані. Рішення: використовувати вебхуки та on-demand ревалідацію.
- Ігнорування типів — часта причина падінь при зміні структури колекції. Рішення: генерувати типи зі схеми Directus.
- Клієнтський fetch для всіх запитів — втрачається SSR, зростає TTFB. Рішення: використовувати Server Components з SDK.
- Нехтування real-time — користувачі не бачать змін у реальному часі. Рішення: підписатися на події через SDK realtime.
Приклади коду
Встановлення SDK
npm install @directus/sdk Налаштування клієнта з типами
// lib/directus.ts import { createDirectus, rest, staticToken, readItems } from '@directus/sdk' interface Article { id: number title: string slug: string content: string // ... інші поля } interface DirectusSchema { articles: Article[] } const directus = createDirectus<DirectusSchema>(process.env.DIRECTUS_URL!) .with(staticToken(process.env.DIRECTUS_STATIC_TOKEN!)) .with(rest()) export { directus } Server Components та ISR
// app/articles/[slug]/page.tsx import { directus } from '@/lib/directus' import { readItems } from '@directus/sdk' import { notFound } from 'next/navigation' export default async function ArticlePage({ params }: { params: { slug: string } }) { const articles = await directus.request( readItems('articles', { fields: ['*', { thumbnail: ['*'] }], filter: { slug: { _eq: params.slug }, status: { _eq: 'published' } }, limit: 1 }) ) if (!articles[0]) notFound() return <article>{/* render */}</article> } export const revalidate = 3600 On-demand Revalidation через вебхук
// app/api/revalidate/route.ts import { revalidateTag } from 'next/cache' export async function POST(req: Request) { const secret = req.headers.get('x-webhook-secret') if (secret !== process.env.DIRECTUS_WEBHOOK_SECRET) return Response.json({ error: 'Unauthorized' }, { status: 401 }) const { collection, payload } = await req.json() revalidateTag(collection) return Response.json({ revalidated: true }) } Підписка на real-time зміни
import { createDirectus, realtime } from '@directus/sdk' const client = createDirectus(DIRECTUS_URL).with(realtime()) await client.connect() const subscription = await client.subscribe('articles', { event: 'update', query: { fields: ['id', 'title'] } }) for await (const message of subscription) { console.log('Оновлення:', message.data) } Зв'яжіться з нами для обговорення вашого проекту — ми підготуємо точну оцінку. Отримайте консультацію по вашій архітектурі вже сьогодні.







