Dynamic и static страницы, revalidate по времени
Автор конспекта: Стогниева Виктория
1. ⚙️ Статические и динамические страницы: поведение по умолчанию
1.1. 🔄 Разница между режимами разработки и продакшена
Поведение fetch-запросов кардинально отличается в зависимости от режима запуска приложения. Это
важно понимать, чтобы избежать путаницы при разработке и деплое.
🧪 Режим разработки (npm run dev)
fetchвсегда запрашивает свежие данные при каждом обращении к странице, создавая иллюзию динамической страницы. 🚀
🚀 Режим продакшена (npm run build)
fetchпо умолчанию кэширует данные.- Запрос выполняется один раз во время сборки (
build), и страница становится статической. 🧱
👉 Эта разница намеренная:
- режим разработки — для удобства разработчика и быстрой обратной связи;
- режим продакшена — для максимальной производительности за счет агрессивного кэширования. ⚡
1.2. 🏗️ Статическая генерация по умолчанию в продакшене
💡 Ключевая идея: любая страница, использующая fetch без дополнительных настроек, в
продакшен-сборке становится статической.
Это означает, что:
- данные запрашиваются только один раз — в момент сборки;
- сгенерированная
HTML-страница сохраняется и отдается всем пользователям без изменений до следующей пересборки.
Страничка, которая сбилдилась в момент билда, будет отдаваться каждому пользователю каждый раз одинаковой.
1.3. 🤖 Когда страница становится динамической автоматически?
Next.js автоматически делает страницу динамической, если обнаруживает использование
динамических API, например:
- Динамические параметры маршрута (
params.id); cookiesилиheaders;- Свойства соединения (
Connection); - Параметры поиска
URL(searchParams).
👉 В этих случаях Next.js понимает, что контент должен генерироваться индивидуально для каждого
запроса, и отключает статическое кэширование. 🔓
2. 🗂️ Управление кэшем на уровне запроса (fetch)
Вы можете контролировать кэширование для каждого отдельного fetch-запроса, передавая второй
аргумент с объектом опций.
2.1. 🔧 Опция cache
❌ cache: no-store
- Полностью отключает кэширование.
Next.jsвыполняет запрос заново при каждом обращении к странице.- Делает всю страницу динамической, даже если остальные запросы могли быть статическими. 🌊
✅ cache: force-cache
- Поведение по умолчанию в продакшене.
Next.jsсначала ищет ответ в кэше:- если есть — берет из кэша;
- если нет — делает сетевой запрос и сохраняет результат в кэш. 💾
3. 🌍 Глобальное управление на уровне страницы (Route Segment Config)
Можно задать стратегию кэширования для всей страницы, экспортируя специальные константы из
page.js.
3.1. 📌 Константа dynamic
auto (по умолчанию)
Next.jsстарается кэшировать максимум возможного и учитывает настройки каждогоfetch.
force-dynamic
- Аналог
cache: 'no-store'для всех запросов. - Принудительно делает страницу динамической. 🔄
force-static
- Принудительно делает страницу статической, даже если используются динамические API (
cookies,headersи т.д.). - Полезно в специфических случаях. 🧠
3.2. ⏱️ Константа revalidate
export const revalidate — глобальная настройка ревалидации по времени для всей страницы.
4. ⏳ Ревалидация по времени (Time-based Revalidation)
4.1. 🧩 Основная концепция
Ревалидация по времени позволяет кэшировать данные на определённый срок (например, 15 секунд). После истечения этого времени данные считаются «протухшими» и обновляются при следующем запросе. 🕒
4.2. 🛠️ Способы настройки
Можно задать ревалидацию:
- На уровне
fetch:
4.3. 🔁 Процесс ревалидации: пошаговый механизм
💡 Это ключевой момент для понимания. Процесс обновления данных происходит не мгновенно.
- 👉 Пользователь делает запрос к странице после того, как установленное время кэша истекло (например, 15 секунд). ⏳
- ⚡
Next.jsнемедленно отдает старые закэшированные данные, чтобы ответ был максимально быстрым. - ♻️ В фоновом режиме
Next.jsзапускает процесс ревалидации:
- выполняет все запросы заново,
- генерирует новую версию страницы,
- обновляет кэш. 💾
- ✅ Только следующий пользователь (или тот же пользователь при повторном запросе) получит обновлённую страницу из свежего кэша.
4.4. ⚠️ Особые значения для revalidate
🔹 revalidate = 0
- 🚫 Запрещает кэширование.
- Эквивалентно
cache: 'no-store'. - Данные будут запрашиваться при каждом обращении к странице.
🔹 revalidate = false
- 🔒 Кэшировать навсегда (вечный кэш, аналог
Infinity). - Данные обновятся только при следующей пересборке проекта.
5. 🎯 Приоритет настроек ревалидации
📌 Главное правило: Если на странице задано несколько правил ревалидации, Next.jsвсегда
выбирает наименьшее значение.
Пример:
- На уровне страницы:
✅ Заключение: ключевые выводы
-
🔄 Разное поведение по умолчанию В режиме разработки
fetchвсегда динамический, что упрощает отладку. 🧪 В продакшенеfetchпо умолчанию статический и кэшируется при сборке для максимальной производительности. ⚡ -
🎛️ Гибкое управление кэшем Вы можете управлять кэшированием:
- на уровне отдельных запросов (
cache,next.revalidate), 🗂️ - на уровне всей страницы через экспорт констант
dynamicиrevalidate. 🌍
- 🐢 Ревалидация не мгновенна После истечения срока кэша обновление происходит в фоне. Пользователь, инициировавший ревалидацию, сначала получает старые данные, а свежие будут доступны только при следующем запросе. 🔁



