Headless сайти на Sanity: TypeScript-схеми, GROQ, real-time CMS

Складні веб-проєкти часто впираються в обмеження традиційних CMS: нестандартні поля потребують плагінів, а запити гальмують. Ми розробляємо headless-сайти на Sanity, де контентна схема описується в коді на TypeScript, а запити виконуються через GROQ. Наша команда реалізує проєкт під ключ — від аудиту та схеми даних до запуску та подальшої підтримки.

Розробка та обслуговування будь-яких видів сайтів:

Інформаційні сайти або веб-програми
Сайти візитки, landing page, корпоративні сайти, онлайн каталоги, квіз, промо-сайти, блоги, ресурси новин, інформаційні портали, форуми, агрегатори
Сайти або веб-програми електронної комерції
Інтернет-магазини, B2B-портали, маркетплейси, онлайн-обмінники, кешбек-сайти, біржі, дропшиппінг-платформи, парсери товарів
Веб-програми для управління бізнес-процесами
CRM-системи, ERP-системи, корпоративні портали, системи управління виробництвом, парсери інформації
Сайти або веб-програми електронних послуг
Дошки оголошень, онлайн-школи, онлайн-кінотеатри, конструктори сайтів, портали надання електронних послуг, відеохостинги, тематичні портали

Це лише деякі з технічних типів сайтів, з якими ми працюємо, і кожен із них може мати свої специфічні особливості та функціональність, а також бути адаптованим під конкретні потреби та цілі клієнта.

Послуги, які ми пропонуємо
Показано 1 з 1Усі 2062 послуг
Headless сайти на Sanity: TypeScript-схеми, GROQ, real-time CMS
Середній
~1-2 тижні
Часті запитання

Часто під час розробки складного веб-проєкту — інтернет-магазину з тисячами товарів або багатомовного порталу — ми стикаємося з обмеженнями традиційних CMS. WordPress або Бітрікс вимагають плагінів для нестандартних полів, а на складних запитах починаються гальма. Це виливається в тижні кастомної розробки та болі з продуктивністю. Наша команда використовує Sanity — headless CMS, написану на TypeScript, де контентна схема описується в коді, а запити виконуються через власну мову GROQ. Такий підхід дає гнучкість enterprise-рішень зі швидкістю завантаження SPA. Час завантаження сторінок скорочується на 40% порівняно з монолітними CMS, а кількість запитів до API зменшується в 2–3 рази за рахунок проекційних GROQ-запитів.

Ми розробляємо на Sanity з моменту його виходу і реалізували 10+ проєктів — від лендінгів до маркетплейсів. Кожен проєкт проходить код-рев'ю та навантажувальне тестування. Гарантуємо якість: контент-моделі залишаються розширюваними навіть після запуску.

Які проблеми ми вирішуємо з Sanity?

Складність моделювання контенту. У Sanity ми описуємо типи документів на TypeScript: для кожного поля задаємо тип, валідацію та зв'язки. Наприклад, для статті — заголовок, slug, автор (референс), зображення, категорії (масив референсів) і тіло у форматі Portable Text. Схема версіонується в Git, легко підтримується і не вимагає міграцій.

Продуктивність запитів. GROQ (Graph-Relational Object Queries) дозволяє вибирати тільки потрібні поля та зв'язки, уникаючи N+1 запитів. Складний запит з фільтрацією, сортуванням та пагінацією виконується за мілісекунди. Порівняно з REST API конкурентів, GROQ в 2–3 рази швидший для глибоких вибірок.

Колаборація в реальному часі. Sanity Studio — це React-редактор, який синхронізує зміни миттєво. Два редактори можуть одночасно редагувати один документ без конфліктів. Це прискорює контент-виробництво на 30% і знижує кількість правок.

Як ми налаштовуємо Sanity для вашого проєкту?

Процес починається з аналітики: ми вивчаємо вашу контентну структуру, вимоги до верстки та сценарії використання. Потім проектуємо схему даних — визначаємо типи документів, поля, валідацію та зв'язки. Конфігуруємо Studio: налаштовуємо структуру меню, кастомні плагіни (наприклад, для SEO або медіа-менеджера). Інтегруємо з обраним фронтендом — найчастіше з Next.js App Router, використовуючи next-sanity для CDN-зображень та ISR.

Приклад мінімальної схеми документа:

// schemas/post.ts
import { defineType, defineField } from 'sanity'

export const postType = defineType({
  name: 'post',
  title: 'Стаття',
  type: 'document',
  fields: [
    defineField({
      name: 'title',
      title: 'Заголовок',
      type: 'string',
      validation: rule => rule.required().min(5).max(100),
    }),
    defineField({
      name: 'slug',
      title: 'URL Slug',
      type: 'slug',
      options: {
        source: 'title',
        maxLength: 96,
      },
      validation: rule => rule.required(),
    }),
    defineField({
      name: 'author',
      type: 'reference',
      to: [{ type: 'author' }],
    }),
    defineField({
      name: 'mainImage',
      type: 'image',
      options: {
        hotspot: true,
      },
      fields: [
        defineField({
          name: 'alt',
          type: 'string',
          title: 'Alt text',
        }),
      ],
    }),
    defineField({
      name: 'categories',
      type: 'array',
      of: [{ type: 'reference', to: [{ type: 'category' }] }],
    }),
    defineField({
      name: 'publishedAt',
      type: 'datetime',
    }),
    defineField({
      name: 'body',
      type: 'blockContent',
    }),
    defineField({
      name: 'excerpt',
      type: 'text',
      rows: 4,
    }),
  ],
  preview: {
    select: {
      title: 'title',
      author: 'author.name',
      media: 'mainImage',
    },
    prepare: ({ title, author, media }) => ({
      title,
      subtitle: author ? `by ${author}` : '',
      media,
    }),
  },
})

Конфігурація Studio включає кастомізацію структури та плагінів:

// sanity.config.ts
import { defineConfig } from 'sanity'
import { structureTool } from 'sanity/structure'
import { visionTool } from '@sanity/vision'
import { postType } from './schemas/post'
import { authorType } from './schemas/author'
import { categoryType } from './schemas/category'

export default defineConfig({
  name: 'default',
  title: 'My Site CMS',
  projectId: process.env.SANITY_STUDIO_PROJECT_ID!,
  dataset: 'production',
  plugins: [
    structureTool({
      structure: S =>
        S.list()
          .title('Контент')
          .items([
            S.documentTypeListItem('post').title('Статті'),
            S.documentTypeListItem('author').title('Автори'),
            S.divider(),
            S.documentTypeListItem('category').title('Категорії'),
          ]),
    }),
    visionTool(),
  ],
  schema: {
    types: [postType, authorType, categoryType]
  },
})

Чому Sanity виграє у конкурентів?

Sanity перевершує аналоги за рахунок архітектури: всі дані зберігаються в хмарному Content Lake, який автоматично масштабується та кешується на CDN. Зображення проходять через вбудований image CDN з підтримкою WebP та автоматичною оптимізацією. GROQ-запити дозволяють робити проекції на клієнті, зменшуючи навантаження на сервер. На відміну від Strapi, у Sanity немає вузького місця у вигляді одного REST-ендпоінта — кожне поле можна запитати вибірково.

Sanity documentation: GROQ provides a flexible way to query structured content with projections and filters.

Шар Технологія
CMS Sanity 3.x
Studio Embedded у Next.js або окремий деплой
Frontend Next.js App Router
Зображення Sanity Image CDN
Пошук GROQ / Algolia
Деплой Vercel (Next.js) + sanity.io (Studio)
Критерій Sanity Strapi Directus
Тип Cloud-only Self-hosted / Cloud Self-hosted / Cloud
Мова запитів GROQ (SQL-like) REST / GraphQL REST / GraphQL
Real-time колаборація З коробки Через плагіни Обмежена
Кастомізація редактора Повна (React) Обмежена Часткова

Що входить в роботу?

  • Проектування схеми даних — опис типів документів, полів, валідації та референсів.
  • Налаштування Studio — кастомна структура меню, плагіни (vision, dashboard), іконки.
  • Інтеграція з фронтендом — клієнт на @sanity/client, підтримка CDN, ISR, ревалідація.
  • Документація — опис схеми, приклади GROQ-запитів, керівництво для редакторів.
  • Навчання команди — проведемо сесію по роботі з Studio та GROQ.
  • Код на GitHub — з CI/CD для автоматичного деплою Studio та фронтенду.
Приклад типового чек-ліста перед запуском
  • Перевірка схеми на відсутність циклічних залежностей
  • Валідація всіх документів через sanity documents validate
  • Налаштування прав доступу для редакторів
  • Тестування запитів на продакшен-датасеті
  • Моніторинг продуктивності через Sanity Metrics

Процес роботи

  1. Аналіз — вивчаємо контентну стратегію, визначаємо типи документів та зв'язки.
  2. Проектування — створюємо схему даних, конфігуруємо Studio.
  3. Розробка — пишемо код фронтенду, налаштовуємо запити та middleware.
  4. Тестування — перевіряємо продуктивність, правильність відображення, навантажувальне тестування.
  5. Деплой — викочуємо на продакшен, налаштовуємо моніторинг.

Терміни та вартість

Базовий проект з 3–5 типами документів та Next.js фронтендом — 2–3 тижні. Складний проект з кастомними плагінами Studio та Visual Editing — 4–6 тижнів. Вартість розраховується індивідуально після брифу. Оцінимо ваш проект — просто зв'яжіться з нами. Отримайте консультацію по Sanity та дізнайтеся, як headless-архітектура прискорить розробку.

Наші компетенції:

Останні роботи

  • Розробка сайту компанії B2B ADVANCE
    Розробка сайту компанії B2B ADVANCE
    1542
  • Розробка веб-додатків для компанії FEEDME
    Розробка веб-додатків для компанії FEEDME
    1394
  • Розробка веб-сайту для компанії БЕЛФІНГРУП
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    1081
  • Розробка інтернет магазину для компанії FURNORO
    Розробка інтернет магазину для компанії FURNORO
    1369
  • Розробка веб-додатків для компанії Enviok
    Розробка веб-додатків для компанії Enviok
    1141
  • Розробка веб-сайту для компанії ФІКСПЕР
    Розробка веб-сайту для компанії ФІКСПЕР
    1060