revalidatePath

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

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

  • revalidatePath доступна как в Node.js, так и в Edge-среде выполнения.
  • revalidatePath аннулирует кэш только при следующем посещении указанного пути. Это означает, что вызов revalidatePath с динамическим сегментом маршрута не приведёт к немедленному массовому пересозданию данных. Аннулирование произойдёт только при следующем посещении пути.
  • В настоящее время revalidatePath аннулирует все маршруты в клиентском кэше роутера (Router Cache). Это временное поведение, которое будет обновлено в будущем для применения только к указанному пути.
  • Использование revalidatePath аннулирует только указанный путь в серверном кэше маршрутов (Route Cache).

Параметры

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

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

revalidatePath не возвращает никакого значения.

Примеры

Пересоздание конкретного URL

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

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

Пересоздание пути страницы

import { revalidatePath } from 'next/cache'
revalidatePath('/blog/[slug]', 'page')
// или с группами маршрутов
revalidatePath('/(main)/post/[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')

Это очистит клиентский кэш роутера (Client-side Router Cache) и пересоздаст кэш данных (Data Cache) при следующем посещении страницы.

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

'use server'

import { revalidatePath } from 'next/cache'

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

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

import { revalidatePath } from 'next/cache'
import { 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',
  })
}