Редакторы контента часто жалуются: чтобы поправить абзац, нужно открыть Sanity Studio, найти нужное поле, сохранить, переключиться на сайт и обновить страницу. Потеря контекста и времени. Мы решаем эту проблему с помощью Sanity Visual Editing и Presentation Tool — режима, когда правка вносится прямо на странице сайта.
Sanity Visual Editing превращает сайт в интерактивный интерфейс для редакторов: клик по тексту открывает соответствующее поле в Sanity Studio, изменение применяется мгновенно с live preview. Это не просто предпросмотр — это полноценное интерактивное редактирование. По нашим оценкам, такая связка сокращает время на контент-правки на 60%, а для мультиавторских проектов продуктивность команды растёт на 30-40%.
Как Visual Editing ускоряет работу редактора?
В основе технологии лежат Content Source Maps. Когда вы запрашиваете данные через next-sanity с флагом stega: true, Sanity внедряет в строки невидимые метаданные. Они указывают, из какого документа и поля взят текст. Visual Editing считывает эти метки при клике на элемент и открывает нужное поле в Studio. Редактору не нужно искать раздел или документ — всё происходит в контексте страницы.
Такой подход быстрее классического Preview, где требуется полная перезагрузка страницы и ручной поиск поля. Visual Editing работает через iframe и WebSocket — изменения отображаются за 200-300 мс. Мы применяли эту связку в более чем 10 проектах, и время на правки сократилось в среднем на 60%. Согласно Sanity Visual Editing documentation, Content Source Maps — это ключевой механизм для связи данных с визуальным редактором.
Почему Content Source Maps — основа Visual Editing?
Content Source Maps добавляют к ответу API метаданные о происхождении каждого поля. Когда stega включён, строки контента содержат невидимые символы с информацией о схеме, документе и пути. Visual Editing считывает эти метки при клике на элемент и точно знает, какое поле открыть в Studio. Это исключает ручной поиск — редактор кликает по тексту на странице и сразу попадает в нужное поле. Без Content Source Maps Visual Editing был бы просто предпросмотром без интерактива.
Подробнее о настройке stega
Для работы Visual Editing нужно включить stega на клиенте. Без этого редактор сможет только просматривать, но не кликать на элементы. Вот пример настройки:
// lib/sanity/client.ts import { createClient } from 'next-sanity' const client = createClient({ projectId: process.env.NEXT_PUBLIC_SANITY_PROJECT_ID!, dataset: 'production', apiVersion: '2024-01-01', useCdn: false, stega: { enabled: true, studioUrl: process.env.NEXT_PUBLIC_SANITY_STUDIO_URL!, }, }) Для live preview с WebSocket используем defineLive. Этот пакет подключает useOptimistic и автоматически обновляет данные при изменении в Studio. Редактор видит правки в реальном времени без перезагрузки.
Шаг 1: Настройка Studio
Устанавливаем плагин @sanity/presentation и конфигурируем previewUrl с указанием origin и маршрутов для Draft Mode. Пример конфигурации:
// sanity.config.ts import { presentationTool } from '@sanity/presentation' export default defineConfig({ plugins: [ structureTool(), presentationTool({ previewUrl: { previewMode: { enable: '/api/draft-mode/enable', disable: '/api/draft-mode/disable', }, origin: process.env.SANITY_STUDIO_PREVIEW_URL || 'http://localhost:3000', }, }), ], }) Шаг 2: Реализация Draft Mode в Next.js
Создаём API-роуты /api/draft-mode/enable и /api/draft-mode/disable, используя validatePreviewUrl для проверки секретного токена.
// app/api/draft-mode/enable/route.ts import { validatePreviewUrl } from '@sanity/preview-url-secret' import { client } from '@/lib/sanity/client' import { draftMode } from 'next/headers' import { redirect } from 'next/navigation' export async function GET(req: Request) { const { isValid, redirectTo = '/' } = await validatePreviewUrl( client.withConfig({ token: process.env.SANITY_API_TOKEN! }), req.url ) if (!isValid) { return new Response('Invalid secret', { status: 401 }) } draftMode().enable() redirect(redirectTo) } // app/api/draft-mode/disable/route.ts import { draftMode } from 'next/headers' import { NextRequest, NextResponse } from 'next/server' export async function GET(req: NextRequest) { draftMode().disable() return NextResponse.redirect(new URL('/', req.url)) } Шаг 3: Подключение клиента
Добавляем VisualEditingProvider в layout, настраиваем sanityFetch и SanityLive для live-обновлений.
Что входит в настройку?
Мы предоставляем полный цикл работ — от аудита до деплоя с обучением редакторов:
| Этап | Что делаем | Результат |
|---|---|---|
| Аудит проекта | Проверяем схему, роутинг, версии пакетов | Отчёт с рекомендациями |
| Проектирование | Определяем, где нужно Visual Editing, какие поля | План интеграции |
| Настройка Studio | Устанавливаем Presentation Tool, конфигурируем preview | Рабочий интерфейс редактирования |
| Интеграция на фронте | Добавляем Draft Mode, VisualEditingProvider, live preview | Интерактивный предпросмотр |
| Тестирование | Проверяем все сценарии: guest, editor, admin | Чеклист пройден |
| Деплой | Настраиваем демо-сервер, CI/CD, переменные окружения | Работающий продакшен |
| Обучение | Документация и 1-2 сессии с редакторами | Команда готова работать |
Сравнение с альтернативами:
| Критерий | Sanity Visual Editing | Обычный Preview |
|---|---|---|
| Время реакции | 200-300 мс (WebSocket) | 2-3 секунды (перезагрузка) |
| Контекст | Редактор видит сайт, кликает на элемент | Нужно найти поле в Studio |
| Глубина правок | Любой элемент, включая изображения | Только текст или блоки |
| Поддержка изменений | Real-time через useOptimistic | Требует ручного обновления |
Сроки и опыт
Настройка Visual Editing с Presentation Tool и Draft Mode занимает от 1 до 2 дней для типового проекта. Для сложных проектов срок может увеличиться до 3–5 дней. Стоимость рассчитывается индивидуально — оценим ваш проект за один рабочий день.
Закажите настройку Visual Editing у нас — мы гарантируем корректную интеграцию благодаря 10+ годам опыта и 50+ успешным интеграциям с CMS. Просто напишите в мессенджер или на почту — мы пришлём пример реализации под ваш проект.







