В App Router ISR не отдельный API — вы задаёте окно revalidation, и Next кладёт HTML + RSC payload в Full Route Cache.
Разбор
- Segment-level:
export const revalidate = 60 на page/layout — окно 60 секунд для route.
- Fetch-level:
fetch(url, { next: { revalidate: 60 } }) — окно для одного источника данных; effective window route = минимум из всех fetch.
- On-demand:
revalidateTag('products') или revalidatePath('/blog/[slug]') — purge в момент изменения данных, без таймера.
generateStaticParams решает, какие dynamic paths prerender на build. Не перечисленные paths — dynamicParams (default true): первый request рендерит on-demand, кэширует, дальше все получают static file. dynamicParams = false — 404 для всего вне списка.
Regeneration atomic и non-blocking: failed background render продолжает отдавать last good page, а не error. User, тригнувший revalidate, stale не ждёт.
Итог
ISR в App Router = Full Route Cache + segment/fetch revalidate + on-demand invalidation; фоновое обновление не наказывает текущего посетителя.