revalidatePath

Функция revalidatePath позволяет очищать кешированные данные по запросу для конкретного пути.

Полезно знать:

  • revalidatePath инвалидирует кеш только при следующем посещении указанного пути. Это означает, что вызов revalidatePath с динамическим сегментом маршрута не приведёт к немедленной инвалидации множества путей одновременно. Инвалидация произойдёт только при следующем посещении пути.
  • В настоящее время revalidatePath инвалидирует все маршруты в клиентском кеше роутера (Client-side Router Cache) при использовании в серверном действии (server action). Это временное поведение и в будущем оно будет изменено для применения только к указанному пути.
  • Использование revalidatePath инвалидирует только указанный путь в серверном кеше маршрутов (Server-side Route Cache).

Параметры

revalidatePath(path: string, type?: 'page' | 'layout'): void;
  • path: Может быть строкой, представляющей файловый путь, связанный с данными, которые нужно ревалидировать (например, /product/[slug]/page), или литеральным сегментом маршрута (например, /product/123). Должен быть короче 1024 символов. Регистр имеет значение.
  • type: (опционально) Строка 'page' или 'layout' для изменения типа пути, который нужно ревалидировать. Если path содержит динамический сегмент (например, /product/[slug]/page), этот параметр обязателен. Если path ссылается на литеральный сегмент маршрута, например /product/1 для динамической страницы (например, /product/[slug]/page), параметр type указывать не нужно.

Возвращаемое значение

Функция revalidatePath не возвращает значение.

Примеры

Ревалидация конкретного URL

import { revalidatePath } from 'next/cache'
revalidatePath('/blog/post-1')

Это приведёт к ревалидации конкретного URL при следующем посещении страницы.

Ревалидация пути страницы

import { revalidatePath } from 'next/cache'
revalidatePath('/blog/[slug]', 'page')
// или с группами маршрутов
revalidatePath('/(main)/blog/[slug]', 'page')

Это приведёт к ревалидации любого URL, соответствующего указанному файлу page, при следующем посещении страницы. Это не инвалидирует страницы, находящиеся ниже указанной. Например, /blog/[slug] не инвалидирует /blog/[slug]/[author].

Ревалидация пути макета

import { revalidatePath } from 'next/cache'
revalidatePath('/blog/[slug]', 'layout')
// или с группами маршрутов
revalidatePath('/(main)/post/[slug]', 'layout')

Это приведёт к ревалидации любого URL, соответствующего указанному файлу layout, при следующем посещении страницы. Это также вызовет ревалидацию страниц ниже с тем же макетом при следующем посещении. Например, в приведённом выше случае /blog/[slug]/[another] также будет ревалидирован при следующем посещении.

Ревалидация всех данных

import { revalidatePath } from 'next/cache'

revalidatePath('/', 'layout')

Это очистит клиентский кеш роутера и ревалидирует кеш данных при следующем посещении страницы.

Серверное действие

'use server'

import { revalidatePath } from 'next/cache'

export default async function submit() {
  await submitForm()
  revalidatePath('/')
}

Обработчик маршрута

import { revalidatePath } from 'next/cache'
import type { NextRequest } from 'next/server'

export async function GET(request: NextRequest) {
  const path = request.nextUrl.searchParams.get('path')

  if (path) {
    revalidatePath(path)
    return Response.json({ revalidated: true, now: Date.now() })
  }

  return Response.json({
    revalidated: false,
    now: Date.now(),
    message: 'Missing path to revalidate',
  })
}
import { revalidatePath } from 'next/cache'

export async function GET(request) {
  const path = request.nextUrl.searchParams.get('path')

  if (path) {
    revalidatePath(path)
    return Response.json({ revalidated: true, now: Date.now() })
  }

  return Response.json({
    revalidated: false,
    now: Date.now(),
    message: 'Missing path to revalidate',
  })
}