メインコンテンツまでスキップ

expirePath

expirePathは、特定のパスのキャッシュデータをオンデマンドで消去することを可能にします。

Good to know:

  • expirePathNode.jsおよびEdgeランタイムの両方で利用可能です;
  • expirePathは、含まれているパスが次に訪問されたときにのみキャッシュを無効化します。これは、expirePathをdynamic route segmentで呼び出しても、多くの無効化が一度にすぐにトリガーされないことを意味します。無効化は、次にそのパスが訪問されたときにのみ発生します;
  • 現在、expirePathはサーバーアクションで使用されると、クライアント側のRouter Cache内のすべてのルートを無効化します。この動作は一時的なものであり、将来的には特定のパスのみに適用されるように更新されます;
  • expirePathを使用すると、サーバー側のRoute Cache内の特定のパスのみが無効化されます。

リファレンス

パラメーター

expirePath(path: string, type?: 'page' | 'layout'): void;
  • path: 期限を切らしたいデータに関連付けられたファイルシステムパスを表す文字列(例:/product/[slug]/page)、またはリテラルルートセグメント(例:/product/123)を指定します。1024文字未満である必要があります。この値は大文字と小文字を区別します。
  • type:(オプション)'page'または'layout'文字列を指定して期限切れにするパスのタイプを変更します。もしpathが動的セグメント(例:/product/[slug]/page)を含んでいる場合、このパラメーターは必須です。パスがリテラルルートセグメントを指す場合(例:動的ページに対する/product/1)、typeを指定するべきではありません。

戻り値

expirePathは値を返しません。

特定のURLの期限切れ

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

これは、次のページ訪問時に特定のURLのキャッシュを消去します。

ページパスの期限切れ

import { expirePath } from 'next/cache'
expirePath('/blog/[slug]', 'page')
// もしくはルートグループを用いて
expirePath('/(main)/blog/[slug]', 'page')

これは、次のページ訪問時に提供されたpageファイルに一致する任意のURLのキャッシュを消去します。具体的なページより下のページは無効になりません。たとえば、/blog/[slug]/blog/[slug]/[author]を無効化しません。

レイアウトパスの期限切れ

import { expirePath } from 'next/cache'
expirePath('/blog/[slug]', 'layout')
// もしくはルートグループを用いて
expirePath('/(main)/post/[slug]', 'layout')

これは、次のページ訪問時に提供されたlayoutファイルに一致する任意のURLのキャッシュを消去します。上記の場合であれば、次回の訪問時に/blog/[slug]/[another]も再検証されます。

全データの期限切れ

import { expirePath } from 'next/cache'

expirePath('/', 'layout')

これは、次のページ訪問時にデータキャッシュを消去します。

サーバーアクション

expirePathをサーバーアクションで呼び出すことができます:

app/actions.ts
'use server'

import { expirePath } from 'next/cache'

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

ルートハンドラー

expirePathをルートハンドラーで呼び出すことができます:

app/api/expire/route.ts
import { expirePath } from 'next/cache'
import type { NextRequest } from 'next/server'

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

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

return Response.json({
expired: false,
now: Date.now(),
message: '期限を切らしたいパスが見つかりません',
})
}