跳到内容

cacheTag

cacheTag 函数允许您标记缓存数据以进行按需失效。通过将标签与缓存条目关联,您可以选择性地清除或重新验证特定的缓存条目,而不会影响其他缓存数据。

用法

要使用 cacheTag,请在您的 next.config.js 文件中启用 cacheComponents 标志

next.config.ts
import type { NextConfig } from 'next'
 
const nextConfig: NextConfig = {
  cacheComponents: true,
}
 
export default nextConfig

cacheTag 函数接受一个或多个字符串值。

app/data.ts
import { cacheTag } from 'next/cache'
 
export async function getData() {
  'use cache'
  cacheTag('my-data')
  const data = await fetch('/api/data')
  return data
}

然后,您可以使用另一个函数中的 revalidateTag API 按需清除缓存,例如,路由处理程序服务器操作

app/action.ts
'use server'
 
import { revalidateTag } from 'next/cache'
 
export default async function submit() {
  await addPost()
  revalidateTag('my-data')
}

须知

  • 幂等标签:多次应用相同的标签没有额外效果。
  • 多个标签:您可以通过向 cacheTag 传递多个字符串值来为单个缓存条目分配多个标签。
cacheTag('tag-one', 'tag-two')
  • 限制:自定义标签的最大长度为 256 个字符,最大标签项数为 128。

示例

标记组件或函数

通过在缓存函数或组件中调用 cacheTag 来标记您的缓存数据

app/components/bookings.tsx
import { 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 { 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')
}