При разработке крупного сайта на Next.js мы столкнулись с проблемой: контент-менеджеры не могли оперативно обновлять страницы. Каждое изменение требовало пересборки проекта — 15–20 минут простоя. Решение — headless CMS Contentful. Это облачная платформа с сильной экосистемой SDK, развитым API и встроенной мультиязычностью. Контент хранится в инфраструктуре Contentful, доступ — через Delivery API (публичный, кешированный) и Management API (запись, приватный). Наш опыт — более 30 внедрений для клиентов разного масштаба, от стартапов до enterprise. Базовый тариф Community бесплатный, а Team — с ростом проекта затраты увеличиваются, но остаются предсказуемыми. Разберём настройку от А до Я за 5 дней. Закажите интеграцию Contentful и ускорьте публикацию контента. Свяжитесь с нами для обсуждения вашего проекта.
Какие проблемы решает интеграция Contentful
N+1 запросы при получении связанных сущностей. Стандартный REST API не позволяет выбирать глубину подгрузки. Contentful решает это параметром include — за один запрос можно получить вложенные Entry и Asset. В примере ниже include: 2 загружает автора и обложку для каждой статьи.
import { createClient } from 'contentful'; const client = createClient({ space: process.env.CONTENTFUL_SPACE_ID!, accessToken: process.env.CONTENTFUL_ACCESS_TOKEN!, environment: 'master', }); const response = await client.getEntries<ArticleFields>({ content_type: 'article', 'fields.publishedAt[lte]': new Date().toISOString(), order: ['-fields.publishedAt'], limit: 10, locale: 'ru', include: 2, }); Hydration mismatch при SSR. Contentful Rich Text возвращается как JSON AST, а не HTML. Используйте библиотеку @contentful/rich-text-react-renderer для кастомного рендеринга без ошибок гидрации.
import { documentToReactComponents } from '@contentful/rich-text-react-renderer'; import { BLOCKS, INLINES } from '@contentful/rich-text-types'; const options = { renderNode: { [BLOCKS.EMBEDDED_ASSET]: (node) => { const { url, title } = node.data.target.fields.file; return <img src={`https:${url}`} alt={title} />; }, [INLINES.HYPERLINK]: (node, children) => ( <a href={node.data.uri} target="_blank" rel="noopener noreferrer"> {children} </a> ), [BLOCKS.EMBEDDED_ENTRY]: (node) => { const entry = node.data.target; if (entry.sys.contentType.sys.id === 'codeBlock') { return <pre><code>{entry.fields.code}</code></pre>; } }, }, }; Сложность локализации. Contentful хранит локализованные поля как словарь {locale: value} в одной записи. Достаточно задать locale: '*' в запросе, чтобы получить все языки сразу. Настройка мультиязычности занимает 2–3 дня и поддерживает до 5 языков в бесплатном тарифе.
Как избежать N+1 запросов при работе с Contentful?
Проблема N+1 возникает, когда для каждой записи делается отдельный запрос на связанные сущности. Contentful решает это через параметр include. Укажите глубину подгрузки — и все связанные Entry и Asset вернутся в одном ответе. В примере выше include: 2 подгружает автора и обложку. Это сокращает количество запросов с 11 до 1, что критично для LCP и TTFB. Наши клиенты отмечают ускорение загрузки страниц до 40%.
Почему Contentful стоит дороже, но выгоднее самописного решения?
Сравним с Directus (self-hosted) и Sanity в таблице:
| Критерий | Contentful | Directus | Sanity |
|---|---|---|---|
| Время на запуск | 1 день | 1–2 дня (развёртывание) | 1 день |
| SDK и инструменты | Официальные для всех популярных фреймворков | Ограниченный набор | Качественные, но меньше |
| Мультиязычность | Встроенная, локализация полей | Через расширения | Встроенная (GROQ) |
| Бесплатный порог | 25 000 записей, 2 языка | Безлимит (самостоятельный хостинг) | 100 000 записей, 2 языка |
Если бюджет ограничен, Directus или Sanity — хорошая альтернатива. Но для production-проектов с командой Contentful даёт готовые решения для ролей, сред и вебхуков. Экономия времени на поддержку самописного решения составляет до 60%, а средний ROI — 300% за год.
Как настроить Contentful?
- Создайте Space в панели управления Contentful.
- Определите Content Types: например, статья, автор, категория. Используйте Management API для автоматизации.
- Настройте Delivery API и Preview API. Получите токены доступа.
- Установите SDK:
npm install contentfulдля Next.js. - Напишите запросы с параметрами
include,locale,order. - Настройте Webhooks для ISR: при публикации контента отправляйте POST на
/api/revalidate. - Протестируйте все кейсы: публикация, черновики, мультиязычность, ошибки.
| Этап | Действия | Результат |
|---|---|---|
| Анализ | Определяем модели контента, связи, локализации | Структура Content Types в Space |
| Проектирование | Создаём Content Types через Management API или UI | Готовые схемы с валидациями |
| Реализация | Настраиваем SDK под вашу платформу (Next.js, Gatsby, React) | Работающие запросы к API |
| Тест | Проверяем все кейсы: публикация, черновики, мультиязычность, ошибки | Стабильная интеграция |
| Деплой | Настраиваем Webhooks для ISR, CI/CD миграций, Preview Mode | Автоматическое обновление контента |
Webhooks для ISR (Incremental Static Regeneration)
Space Settings -> Webhooks -> Add Webhook Name: Next.js Revalidation URL: https://example.com/api/revalidate Events: Entry.publish, Entry.unpublish, Asset.publish // app/api/revalidate/route.ts export async function POST(req: Request) { const body = await req.json(); const contentType = body.sys?.contentType?.sys?.id; if (contentType === 'article') { await revalidatePath('/blog'); await revalidatePath(`/blog/${body.fields?.slug?.['en-US']}`); } return Response.json({ revalidated: true }); } Гарантии стабильной работы при масштабировании
Гарантии стабильной работы при масштабировании
Contentful поддерживает rate limiting (1000 запросов/мин на Community-тарифе), поэтому для высоконагруженных проектов настраивается CDN-кеширование и ISR. Мы используем паттерн BFF (Backend For Frontend) для агрегации данных и минимизации запросов к API. Рекомендуем также добавить fallback-страницы и мониторинг ошибок. Настройка экономит до 40% времени на публикацию контента.
Что входит в работу
- Проектирование моделей контента (Content Types) с учётом SEO и локализации
- Готовая интеграция SDK с фреймворком (Next.js, Gatsby, React)
- Настройка Delivery API, Preview API и Management API
- Реализация Webhooks для автоматической ревалидации (ISR)
- Документация по моделям и доступам
- Обучение команды (1–2 сессии)
- Поддержка в течение 30 дней после запуска
Получите консультацию по интеграции Contentful для вашего проекта. Свяжитесь с нами, чтобы обсудить детали и сроки.







