revalidatePath

revalidatePath 允許您針對特定路徑按需清除 快取資料

須知事項:

  • revalidatePath 僅在下次訪問包含的路徑時才會使快取失效。這意味著使用動態路由區段呼叫 revalidatePath 不會立即觸發大量重新驗證,只有當下次訪問該路徑時才會失效。
  • 目前,在伺服器動作中使用 revalidatePath 會使 客戶端路由快取 (client-side Router Cache) 中的所有路由失效。此行為是暫時的,未來將更新為僅應用於特定路徑。
  • 使用 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/[slug]/page 中的 /product/1),則不應提供 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')

這將在下次訪問頁面時重新驗證符合提供的 page 檔案的所有 URL。這 不會 使特定頁面下方的頁面失效。例如,/blog/[slug] 不會使 /blog/[slug]/[author] 失效。

重新驗證佈局路徑

import { revalidatePath } from 'next/cache'
revalidatePath('/blog/[slug]', 'layout')
// 或使用路由群組
revalidatePath('/(main)/post/[slug]', 'layout')

這將在下次訪問頁面時重新驗證符合提供的 layout 檔案的所有 URL。這會導致具有相同佈局的子頁面在下次訪問時重新驗證。例如在上述情況中,/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 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',
  })
}

On this page