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

cacheTag

cacheTag関数は、キャッシュされたデータにタグを付け、必要に応じて無効化することを可能にします。キャッシュエントリにタグを関連付けることで、他のキャッシュデータに影響を与えることなく特定のキャッシュエントリを選択的に消去または再検証できます。

使用方法

cacheTagを使用するには、next.config.jsファイルでdynamicIOフラグを有効にします:

next.config.ts
import type { NextConfig } from 'next'

const nextConfig: NextConfig = {
experimental: {
dynamicIO: true,
},
}

export default nextConfig

cacheTag関数は、単一の文字列値または文字列の配列を取ります。

app/data.ts
import { unstable_cacheTag as cacheTag } from 'next/cache'

export async function getData() {
'use cache'
cacheTag('my-data')
const data = await fetch('/api/data')
return data
}

その後、例えばroute handlerServer Actionなどの別の関数でrevalidateTag APIを使用して、オンデマンドでキャッシュを消去できます:

app/action.ts
'use server'

import { revalidateTag } from 'next/cache'

export default async function submit() {
await addPost()
revalidateTag('my-data')
}

Good to know

  • 冪等性のあるタグ: 同じタグを複数回適用しても追加の効果はありません
  • 複数タグ: cacheTagに配列を渡すことで、1つのキャッシュエントリに複数のタグを割り当てることができます
cacheTag('tag-one', 'tag-two')

コンポーネントまたは関数にタグを付ける

キャッシュされた関数やコンポーネント内でcacheTagを呼び出すことで、キャッシュされたデータにタグを付けます:

app/components/bookings.tsx
import { unstable_cacheTag as cacheTag } from 'next/cache'

interface BookingsProps {
type: string
}

export async function Bookings({ type = 'haircut' }: BookingsProps) {
'use cache'
cacheTag('bookings-data')

async function getBookingsData() {
const data = await fetch(`/api/bookings?type=${encodeURIComponent(type)}`)
return data
}

return //...
}

外部データからタグを作成する

非同期関数から返されたデータを使用してキャッシュエントリにタグを付けることができます。

app/components/bookings.tsx
import { unstable_cacheTag as cacheTag } from 'next/cache'

interface BookingsProps {
type: string
}

export async function Bookings({ type = 'haircut' }: BookingsProps) {
async function getBookingsData() {
'use cache'
const data = await fetch(`/api/bookings?type=${encodeURIComponent(type)}`)
cacheTag('bookings-data', data.id)
return data
}
return //...
}

タグ付きキャッシュの無効化

revalidateTagを使用して、必要に応じて特定のタグのキャッシュを無効化できます:

app/actions.ts
'use server'

import { revalidateTag } from 'next/cache'

export async function updateBookings() {
await updateBookingData()
revalidateTag('bookings-data')
}