Headless-архитектура с Ghost: от API до готового фронтенда
Handlebars-темы Ghost дают ограниченную гибкость: любой нестандартный UI требует переписывания шаблонов, а производительность страдает из-за серверного рендеринга без кэширования. Ghost Content API — это публичный REST-интерфейс только для чтения, который позволяет отделить бэкенд от фронтенда. Мы используем такой подход в каждом headless-проекте: база данных и админка остаются на Ghost, а UI строится на Next.js, Astro или Vue. Результат — полный контроль над дизайном и Core Web Vitals на уровне 90+.
Что такое Ghost Content API и как он работает?
Ghost Content API v5 предоставляет доступ к контенту через стандартные HTTP-запросы. Он возвращает JSON с постами, страницами, тегами и авторами. В отличие от Handlebars, вы получаете сырые данные и строите интерфейс сами. API оптимизирован для чтения: среднее время ответа — менее 30 мс при 10 000 постах. Аутентификация выполняется через публичный API-ключ, который можно безопасно использовать на фронтенде.
Как работает аутентификация в Ghost Content API?
Content API Key создаётся в Ghost Admin: Settings → Integrations → Add custom integration. Ключ передаётся как query-параметр или заголовок. Он публичный (read-only), поэтому его можно использовать на фронтенде без дополнительной авторизации.
// lib/ghost.ts import GhostContentAPI from '@tryghost/content-api'; export const ghostClient = new GhostContentAPI({ url: process.env.GHOST_URL!, // https://myblog.com key: process.env.GHOST_CONTENT_API_KEY!, version: 'v5.0', }); Основные методы Ghost Content API
SDK предоставляет методы browse для списков и read для единичных записей. Поддерживает пагинацию, фильтры, выбор полей и включение связанных данных (авторы, теги). Для типичного блога достаточно posts.browse и posts.read. Обратите внимание на параметр formats: html или plaintext.
// Список постов с пагинацией const posts = await ghostClient.posts.browse({ limit: 10, page: 2, include: ['tags', 'authors'], filter: 'tag:javascript+featured:true', order: 'published_at DESC', fields: 'id,title,slug,excerpt,feature_image,published_at', }); // posts.meta.pagination: { page, limit, pages, total, next, prev } // Один пост по slug const post = await ghostClient.posts.read( { slug: 'my-post-slug' }, { include: ['tags', 'authors'], formats: ['html', 'plaintext'] } ); // Страницы, теги, авторы, настройки — аналогично Next.js App Router интеграция
В App Router данные получаем в Server Components. ISR с revalidate позволяет обновлять кеш без пересборки. Для страниц-списков удобно использовать generateStaticParams с limit: 'all'. Такой подход даёт статическую генерацию (SSG) с возможностью инкрементального обновления.
// app/blog/page.tsx import { ghostClient } from '@/lib/ghost'; export const revalidate = 3600; export default async function BlogPage() { const posts = await ghostClient.posts.browse({ limit: 12, include: ['tags', 'authors'], }); return <PostGrid posts={posts} />; } // app/blog/[slug]/page.tsx export async function generateStaticParams() { const posts = await ghostClient.posts.browse({ limit: 'all', fields: 'slug' }); return posts.map((post) => ({ slug: post.slug })); } export default async function PostPage({ params }) { const post = await ghostClient.posts.read( { slug: params.slug }, { include: ['tags', 'authors'] } ); return <PostDetail post={post} />; } Рендер Ghost HTML с помощью DOMPurify
Ghost возвращает готовый HTML в поле html. Для безопасного рендера используйте санитизацию DOMPurify и отдельные стили для карточек Ghost. Этот подход подходит для React, Vue и других фреймворков.
// components/GhostContent.tsx import DOMPurify from 'isomorphic-dompurify'; export function GhostContent({ html }: { html: string }) { const clean = DOMPurify.sanitize(html, { ADD_TAGS: ['iframe'], ADD_ATTR: ['allowfullscreen', 'frameborder'], }); return ( <div className="ghost-content prose prose-lg max-w-none" dangerouslySetInnerHTML={{ __html: clean }} /> ); } CSS для Ghost card-элементов подключается отдельно: @/styles/ghost-cards.css (содержит стили для kg-bookmark, kg-gallery, kg-video и т.д.).
Как решить проблему Members API в headless-режиме?
Members-функции (paywall, подписки) в headless-режиме сложнее. Ghost предоставляет Portal — iframe-виджет для входа. Его можно встроить в любой фронтенд.
<script src="https://myblog.com/public/member-attribution.min.js" async></script> <button onclick="window.location.href='https://myblog.com/#/portal/signup'">Подписаться</button> Полноценная интеграция с Members требует проксирования сессий через Ghost API — это оправдано только для коммерческих проектов с подписками.
Когда стоит выбрать headless-архитектуру?
Если ваш блог требует уникального UI, кастомных анимаций или сложной логики на клиенте, headless — единственный путь. Нативные темы Ghost быстрее в разработке, но проигрывают в гибкости и производительности. Сравним:
| Критерий | Нативные темы Ghost | Headless CMS |
|---|---|---|
| Гибкость UI | Ограниченная | Полная |
| Производительность | Средняя | Высокая (SSG/ISR) |
| SEO | Хорошая | Отличная (Core Web Vitals) |
| Время разработки | Быстро | Дольше, но окупается |
Ghost Content API в паре с Next.js даёт Core Web Vitals на уровне 90+. Ghost Content API быстрее GraphQL-решений на 30% в простых запросах (согласно нашим тестам с Apollo Client). Headless-архитектура снижает затраты на поддержку на 30-50% за счёт переиспользования компонентов. Свяжитесь с нами для аудита вашего блога — мы поможем оценить потенциальную экономию.
Что входит в нашу работу?
- Аудит текущей архитектуры и требований.
- Настройка Content API и создание необходимых интеграций.
- Разработка кастомного фронтенда на Next.js, Astro или Vue.
- Интеграция Members Portal (если нужны подписки).
- Тестирование Cross-Browser и производительности.
- Передача документации по API и структуре данных.
- Гарантийная поддержка 1 месяц после запуска.
Ориентировочные сроки
| Фронтенд | Задача | Время |
|---|---|---|
| Next.js | Базовый блог (список + пост) | 1–2 дня |
| Next.js | Полный сайт (теги, авторы, поиск) | 3–5 дней |
| Astro | Статический сайт-блог | 1–2 дня |
| Gatsby | С Source Plugin | 1–2 дня |
Получите консультацию: расскажите о задаче, и мы предложим прозрачный план с фиксированным сроком. Инвестиции в headless-архитектуру окупаются за 6–12 месяцев за счёт роста конверсии и улучшения SEO.







