Скорость загрузки сайта — один из ключевых факторов ранжирования в Яндексе и Google. Медицинский сайт, который открывается за 5 секунд вместо 1,5, теряет до 40% посетителей ещё до того, как они увидят контент. А каждый потерянный посетитель — это потерянный лид стоимостью 3 000 – 15 000 ₽.
ISR (Incremental Static Regeneration) — технология, которая решает извечную дилемму разработки: статические страницы быстрые, но не обновляются; динамические обновляются, но медленные. ISR даёт и то, и другое: скорость статики + свежесть динамики.
В этой статье мы разберём ISR и revalidation в контексте медицинских и стоматологических сайтов: зачем это нужно, как работает, как внедрить, и какой эффект на SEO ожидать.
Проблема: почему медицинские сайты тормозят
Анатомия типичного сайта клиники
Типичный сайт стоматологической клиники в 2026 году:
- 30-100 страниц (услуги, врачи, статьи, кейсы)
- Каталог услуг с ценами (обновляется 1-2 раза в месяц)
- Блог с 20-50+ статьями (новые статьи 1-4 раза в месяц)
- Расписание врачей (меняется еженедельно)
- Отзывы (обновляются ежедневно)
- Акции (меняются ежемесячно)
Три подхода к генерации страниц
SSG (Static Site Generation) — полностью статический сайт:
- Все страницы генерируются при сборке (build time)
- Плюс: максимальная скорость (HTML готов заранее)
- Минус: для обновления контента нужна пересборка всего сайта
- Проблема для клиники: изменили цену → ждём пересборку 5-15 минут → деплой → только тогда пациент видит новую цену
SSR (Server-Side Rendering) — динамический сайт:
- Каждая страница генерируется при каждом запросе на сервере
- Плюс: контент всегда актуальный
- Минус: медленнее (сервер генерирует HTML на каждый запрос)
- Проблема для клиники: 500 посетителей одновременно → сервер тормозит → TTFB 2-5 секунд → пациенты уходят
ISR (Incremental Static Regeneration) — гибридный подход:
- Страницы генерируются статически, но обновляются в фоновом режиме
- Плюс: скорость статики + свежесть динамики
- Минус: небольшая задержка обновления (от секунд до минут)
- Для клиники: страница открывается за 0,5-1 секунду, цены обновляются через 60 секунд после изменения в CMS
Что такое ISR
Определение
ISR (Incremental Static Regeneration) — механизм в Next.js, который позволяет обновлять статические страницы после сборки, не пересобирая весь сайт. Страница остаётся статической (быстрой), но может быть ре-генерирована с новыми данными по требованию или по таймеру.
Как работает ISR: пошагово
- Build time: При сборке сайта генерируются статические HTML-страницы для всех маршрутов
- Первый запрос: Пользователь открывает страницу → получает готовый HTML из CDN/кэша → мгновенная загрузка
- Фоновая ревалидация: По истечении заданного времени (revalidate) следующий запрос триггерит фоновую регенерацию
- Обновление: Новая версия страницы готова → следующие пользователи получают обновлённый контент
- Stale-While-Revalidate: Пока новая версия генерируется, все пользователи видят «старую» (cached) версию — никто не ждёт
Аналогия для понимания
Представьте меню ресторана:
- SSG: Меню напечатано раз в год. Чтобы изменить цену, нужно перепечатать все экземпляры.
- SSR: Меню пишется от руки для каждого гостя. Всегда актуальное, но гость ждёт 5 минут.
- ISR: Меню напечатано, но официант проверяет актуальность каждые 15 минут. Если цена изменилась — перепечатывает одну страницу, пока гости смотрят текущую версию.
Хотите больше пациентов?
Пройдите квиз за 1 минуту — покажем точки роста вашей клиники
ISR в Next.js: техническая реализация
Time-Based Revalidation (ревалидация по времени)
Самый простой способ — указать интервал обновления в секундах:
// app/uslugi/implantaciya/page.tsx
export const revalidate = 3600; // обновлять каждый час
async function getServiceData() {
const res = await fetch('https://cms.clinic.ru/api/services/implantaciya');
return res.json();
}
export default async function ImplantaciyaPage() {
const data = await getServiceData();
return (
<article>
<h1>{data.title}</h1>
<p>Цена: от {data.price} ₽</p>
<div dangerouslySetInnerHTML={{ __html: data.content }} />
</article>
);
}Как работает:
- Страница генерируется при сборке
- Первый час: все посетители получают закэшированную версию (мгновенно)
- Через час: первый запрос триггерит фоновую регенерацию
- Пока регенерация идёт — пользователь видит старую версию (не ждёт)
- Следующие запросы получают обновлённую страницу
On-Demand Revalidation (ревалидация по требованию)
Более гибкий подход — обновлять страницу, когда контент реально изменился:
// app/api/revalidate/route.ts
import { revalidatePath, revalidateTag } from 'next/cache';
import { NextRequest, NextResponse } from 'next/server';
export async function POST(request: NextRequest) {
const { secret, path, tag } = await request.json();
// Проверка секретного ключа
if (secret !== process.env.REVALIDATION_SECRET) {
return NextResponse.json({ error: 'Invalid secret' }, { status: 401 });
}
// Ревалидация по пути
if (path) {
revalidatePath(path);
return NextResponse.json({ revalidated: true, path });
}
// Ревалидация по тегу
if (tag) {
revalidateTag(tag);
return NextResponse.json({ revalidated: true, tag });
}
return NextResponse.json({ error: 'No path or tag' }, { status: 400 });
}Как использовать:
- В CMS (Strapi, Payload) настраивается вебхук: при изменении цены на имплантацию → POST на `/api/revalidate` с `{ path: '/uslugi/implantaciya' }`
- Страница регенерируется мгновенно
- Следующий посетитель видит актуальную цену
Tag-Based Revalidation (ревалидация по тегам)
Самый гибкий подход — группировка связанного контента через теги:
// Получение данных с тегом
async function getDoctors() {
const res = await fetch('https://cms.clinic.ru/api/doctors', {
next: { tags: ['doctors'] }
});
return res.json();
}
async function getServices() {
const res = await fetch('https://cms.clinic.ru/api/services', {
next: { tags: ['services'] }
});
return res.json();
}// Ревалидация по тегу
revalidateTag('doctors'); // Обновит все страницы, использующие тег 'doctors'
revalidateTag('services'); // Обновит все страницы с услугамиПреимущество: изменили информацию о враче → обновились все страницы, где упоминается этот врач (карточка врача, страница команды, страницы услуг).
Зачем ISR стоматологическому сайту
1. Скорость загрузки и Core Web Vitals
Core Web Vitals — набор метрик Google, влияющих на ранжирование:
Метрика | Что измеряет | Хорошо | Плохо |
|---|---|---|---|
LCP (Largest Contentful Paint) | Время загрузки основного контента | < 2,5 с | > 4 с |
FID / INP (Interaction to Next Paint) | Задержка интерактивности | < 200 мс | > 500 мс |
CLS (Cumulative Layout Shift) | Сдвиги макета | < 0,1 | > 0,25 |
ISR-страница обслуживается из CDN/кэша → LCP < 1 секунда. SSR-страница генерируется на сервере → LCP 2-5 секунд. Разница — позиции в поисковой выдаче.
2. Актуальность контента для SEO
Поисковые системы ценят актуальный контент. Страница с устаревшими ценами или неактуальными врачами — минус в ранжировании. ISR позволяет обновлять контент без задержек:
- Изменилась цена → страница обновлена через 60 секунд
- Добавлен новый врач → карточка появляется на сайте мгновенно
- Опубликована статья → индексируется при следующем обходе краулером
3. Масштабируемость
Статический сайт на 50 страниц — не проблема. Но клиника с блогом в 200 статей, 30 врачами, 50 услугами, 500 отзывами — это 800+ страниц. При SSG пересборка всего сайта при каждом изменении занимает 10-20 минут. ISR обновляет только изменённые страницы.
4. Стабильность при нагрузке
Утром понедельника, после запуска рекламной кампании, на сайт приходят 500 посетителей одновременно. SSR-сайт: сервер перегружен, TTFB растёт до 5-10 секунд, часть пользователей видит 503. ISR-сайт: все получают закэшированную страницу из CDN за 0,2 секунды. Сервер не нагружен.
5. Экономия на хостинге
ISR-страницы обслуживаются из edge-CDN (Vercel, Cloudflare). Нагрузка на origin-сервер минимальна. Для SSR каждый запрос — это работа сервера. При трафике 10 000+ визитов в месяц разница в стоимости хостинга ощутима.
Практические сценарии для стоматологического сайта
Страницы услуг (revalidate: 3600)
Обновляются редко (1-2 раза в месяц). ISR с интервалом 1 час — оптимально.
// app/uslugi/[slug]/page.tsx
export const revalidate = 3600;Что обновляется: цены, описания, фото «до/после», список врачей по направлению.
Страницы врачей (revalidate: 86400 + on-demand)
Обновляются при изменении информации о враче. Time-based: 1 раз в сутки. On-demand: при изменении в CMS.
export const revalidate = 86400; // 24 часа фоновая ревалидация
// + вебхук из CMS при изменении карточки врачаБлог (revalidate: 3600 + on-demand)
Новые статьи появляются 1-4 раза в месяц. Существующие статьи почти не меняются.
// app/blog/[slug]/page.tsx
export const revalidate = 3600;
// При публикации новой статьи — on-demand revalidation:
// POST /api/revalidate { tag: 'blog' }Страница отзывов (revalidate: 300)
Обновляются часто (новые отзывы ежедневно). ISR с интервалом 5 минут — пациент оставил отзыв, через 5 минут он появляется на сайте.
// app/otzyvy/page.tsx
export const revalidate = 300; // 5 минутРасписание (revalidate: 60 или on-demand)
Расписание меняется часто. ISR с коротким интервалом или on-demand ревалидация при каждом изменении в МИС.
// app/raspisanie/page.tsx
export const revalidate = 60; // 1 минутаСтраница акций (on-demand)
Акции меняются нечасто, но должны появляться мгновенно. On-demand ревалидация из CMS.
Устали от хаоса в заявках?
AI-автоматизация уберёт рутину и увеличит конверсию записей до 2×
Stale-While-Revalidate: ключевой принцип
Как это работает
Stale-While-Revalidate (SWR) — паттерн кэширования, на котором построен ISR:
- Пользователь запрашивает страницу
- Если в кэше есть актуальная версия (fresh) → отдаётся мгновенно
- Если кэш устарел (stale), но страница есть → отдаётся устаревшая версия мгновенно, одновременно в фоне запускается регенерация
- Следующий запрос получает уже новую версию
Никто не ждёт. Это главное преимущество SWR перед классическим кэшированием, где при устаревании кэша пользователь ждёт генерации новой версии.
Для медицинского сайта это значит
- Пациент никогда не видит пустую страницу или спиннер
- В худшем случае он видит контент, устаревший на несколько минут (для медицинского сайта — допустимо)
- Core Web Vitals всегда хорошие, потому что страница всегда отдаётся из кэша
ISR vs другие подходы: сравнение
Критерий | SSG | SSR | ISR | CSR (SPA) |
|---|---|---|---|---|
Скорость первой загрузки | Отлично | Средне | Отлично | Плохо |
Актуальность данных | Только при сборке | Всегда | С задержкой секунды-минуты | Всегда |
SEO | Отлично | Хорошо | Отлично | Плохо |
Нагрузка на сервер | Минимальная | Высокая | Минимальная | Минимальная |
Стоимость хостинга | Низкая | Высокая | Низкая | Низкая |
Сложность реализации | Низкая | Средняя | Средняя | Высокая |
Подходит для мед. сайтов | Малые сайты | Динамические порталы | Оптимально | Не подходит |
Вывод: ISR — оптимальный подход для медицинских сайтов, где контент обновляется регулярно (но не в реальном времени), а скорость и SEO критически важны.
Внедрение ISR: чеклист для стоматологического сайта
Шаг 1: Аудит текущего сайта
- Измерьте Core Web Vitals: Google PageSpeed Insights, Lighthouse
- Определите TTFB (Time to First Byte) текущего сайта
- Проверьте, какой фреймворк используется (если не Next.js — миграция потребуется)
Шаг 2: Классификация страниц
Разделите все страницы по частоте обновления:
- Статические (revalidate: false): О клинике, контакты, лицензии — не меняются
- Редко обновляемые (revalidate: 86400): Услуги, врачи, FAQ
- Регулярно обновляемые (revalidate: 3600): Блог, кейсы
- Часто обновляемые (revalidate: 60-300): Расписание, отзывы, акции
Шаг 3: Настройка CMS-вебхуков
Для on-demand ревалидации настройте вебхуки в CMS:
- Strapi / Payload CMS: встроенная поддержка вебхуков
- При изменении контента → POST на `/api/revalidate` с путём или тегом
Шаг 4: Деплой с edge-кэшированием
- Vercel — нативная поддержка ISR, CDN с edge-кэшированием по всему миру
- Cloudflare Pages — поддержка через middleware
- Свой сервер — настройка nginx + кэш + Node.js (сложнее, но возможно)
Шаг 5: Мониторинг
- Настройте мониторинг Core Web Vitals (Google Search Console, CrUX)
- Проверяйте корректность ревалидации: после изменения контента — страница обновилась?
- Следите за hit rate кэша (% запросов, обслуженных из кэша)
Реклама не окупается?
Проверим вашу воронку и найдём, где утекают деньги — бесплатно
Результаты: что даёт ISR медицинскому сайту
Данные из наших проектов
Метрика | До ISR (SSR) | После ISR | Изменение |
|---|---|---|---|
TTFB | 1,2-3,5 с | 0,05-0,2 с | -95% |
LCP | 3,5-6 с | 0,8-1,5 с | -70% |
PageSpeed Score (Mobile) | 35-55 | 85-98 | +80% |
Показатель отказов | 45-60% | 25-35% | -40% |
Конверсия сайта | 2,5-4% | 4-7% | +60% |
Стоимость хостинга | 5 000-15 000 ₽/мес | 1 500-5 000 ₽/мес | -65% |
Влияние на SEO
- Улучшение Core Web Vitals → рост позиций в поиске на 5-15 позиций
- Быстрая индексация новых страниц благодаря ISR
- Снижение показателя отказов → позитивный поведенческий сигнал
- Увеличение глубины просмотра (быстрые переходы между страницами)
Влияние на конверсию
Каждая секунда задержки загрузки снижает конверсию на 7% (Google). При переходе с TTFB 3 секунды на 0,2 секунды: потенциальный рост конверсии на 20-40%. При CPL 8 000 ₽ и 100 лидов/мес это 160 000 – 320 000 ₽ дополнительной стоимости лидов в месяц.
FAQ
Нужен ли Next.js для ISR?
ISR в текущей реализации — функция Next.js. Аналогичный подход (stale-while-revalidate) можно реализовать вручную на любом стеке через CDN и серверный кэш, но это значительно сложнее. Astro (конкурент Next.js) также поддерживает ISR-подобный подход.
Подходит ли ISR для сайта с динамическими данными (расписание, цены)?
Да. Для часто меняющихся данных используйте короткий интервал ревалидации (60-300 секунд) или on-demand ревалидацию. Пациент может видеть расписание, актуальное 1-5 минут назад — это приемлемо для большинства сценариев.
Сколько стоит миграция на ISR?
Если сайт уже на Next.js — от 20 000 ₽ (настройка ревалидации для существующих страниц). Если нужна полная миграция с другого фреймворка — 200 000 – 800 000 ₽ в зависимости от размера сайта.
ISR работает с Яндексом?
Да. Яндекс индексирует HTML-контент, который отдаёт ISR. Поскольку ISR генерирует полноценные HTML-страницы (не клиентский рендеринг), Яндекс-бот видит и индексирует весь контент без проблем.
Что если страница не обновилась после изменения в CMS?
Проверьте: (1) работает ли вебхук из CMS в `/api/revalidate`; (2) корректен ли секретный ключ; (3) правильный ли path/tag. Используйте логирование: каждый вызов ревалидации должен записываться в лог.
ISR и HTTPS — есть ли нюансы?
Нет. ISR работает одинаково на HTTP и HTTPS. HTTPS обязателен для любого медицинского сайта (SEO + доверие + 152-ФЗ).
Заключение
ISR — это не просто техническая оптимизация. Это конкурентное преимущество. Сайт клиники, который открывается за 0,5 секунды, ранжируется выше, конвертирует лучше и стоит дешевле в обслуживании.
Для стоматологических сайтов с их спецификой (регулярное обновление цен, врачей, расписания + высокая стоимость каждого лида) ISR — оптимальный подход. Он совмещает скорость статики с гибкостью динамики.
Мы в СУББОТА INC строим сайты для клиник имплантации на Next.js с ISR. Если ваш сайт тормозит — а значит, теряет пациентов — давайте это исправим.
Читайте также:


