Incremental Static Regeneration

Incremental Static Regeneration (ISR) — это подход к генерации статических страниц, позволяющий сочетать преимущества статической генерации и динамического обновления данных без полной пересборки всего приложения. В экосистеме Vue.js ISR часто используется вместе с фреймворками, ориентированными на серверный рендеринг, такими как Nuxt.js, особенно в версиях, поддерживающих full static генерацию или hybrid rendering.

Основная идея ISR

В традиционном статическом подходе каждая страница генерируется на этапе сборки. Этот метод обеспечивает высокую производительность, но не подходит для часто обновляемого контента, так как требует полной пересборки сайта. ISR решает эту проблему, позволяя:

  • Генерировать страницы статически при первом запросе;
  • Обновлять их через заданный интервал времени или на основе событий;
  • Сохранять при этом статическую природу страницы для пользователей.

Принципы работы ISR

  1. Статическая генерация на запрос (On-Demand Static Generation) При первом обращении к странице сервер генерирует HTML и сохраняет его в кэш. Следующие пользователи получают уже сгенерированную страницу.

  2. Регенерация через интервал (Revalidation Interval) Каждая страница может иметь время жизни, после которого сервер автоматически пересоздаёт её при следующем запросе. Это позволяет поддерживать актуальность данных без полной пересборки проекта.

  3. Гибридный подход Часть страниц может оставаться статической навсегда, часть — регенерироваться динамически. Это особенно полезно для сайтов с большим количеством контента, где обновление всех страниц одновременно нецелесообразно.

Использование ISR в Nuxt.js с Vue.js

Nuxt.js предоставляет удобный способ интеграции ISR через nuxt generate, fetch и новые API для server-side и static rendering.

Настройка ISR через nuxt.config.js
export default {
  target: 'static', // Полная статическая генерация
  generate: {
    fallback: true, // Для страниц, которые генерируются on-demand
    interval: 60 // Время регенерации в секундах
  }
}
  • target: 'static' указывает, что основной режим — статическая генерация.
  • fallback: true позволяет Nuxt.js возвращать страницу-заглушку, пока ISR создаёт HTML.
  • interval задаёт интервал регенерации страницы.
Использование fetch для динамических данных
export default {
  async fetch() {
    this.posts = await this.$axios.$get('https://api.example.com/posts')
  },
  data() {
    return {
      posts: []
    }
  }
}

Данные подгружаются на сервере, и при первой генерации страницы они сохраняются статически. После истечения интервала они могут быть автоматически обновлены.

Преимущества ISR

  • Скорость загрузки — пользователи получают статический HTML.
  • Актуальность данных — страницы обновляются без полной пересборки.
  • Масштабируемость — большое количество страниц можно поддерживать с минимальными ресурсами.
  • Простота интеграции с Vue.js компонентами — структура компонентов и реактивность остаются неизменными.

Ограничения и особенности

  • ISR требует поддержки серверной инфраструктуры или хостинга, который может обрабатывать on-demand генерацию.
  • Интервал регенерации задаётся глобально или на уровне маршрута; слишком частое обновление может создать нагрузку на сервер.
  • Компоненты с высокой интерактивностью или состоянием, зависящим от пользователя, должны быть отдельно реализованы через client-side рендеринг.

Практические сценарии использования

  1. Блоги и новостные сайты — статьи обновляются ежедневно или ежечасно, но пользователи получают мгновенную загрузку.
  2. Электронная коммерция — каталоги товаров могут иметь статические страницы, которые обновляются при изменении ассортимента.
  3. Порталы с динамическим контентом — комментарии и оценки могут быть подгружены через API, а основная структура страницы остаётся статической.

Взаимодействие с Vue.js компонентами

ISR не влияет на реактивность Vue.js компонентов. Компоненты продолжают использовать props, data, computed и watch, а обновление страницы через ISR лишь обновляет базовый HTML. Client-side hydration позволяет Vue.js корректно инициализировать интерактивные элементы на статически сгенерированной странице.


Incremental Static Regeneration сочетает скорость статических сайтов с гибкостью динамических приложений. В экосистеме Vue.js этот подход особенно эффективен в сочетании с Nuxt.js, позволяя создавать масштабируемые, производительные и актуальные веб-приложения без потери удобства разработки.