cacheTag

Функция cacheTag позволяет помечать кешированные данные для инвалидации по требованию. Связывая теги с записями кеша, вы можете выборочно очищать или перевалидировать определенные записи, не затрагивая другие кешированные данные.

Использование

Чтобы использовать cacheTag, включите флаг dynamicIO в вашем файле next.config.js:

import type { NextConfig } from 'next'

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

export default nextConfig
const nextConfig = {
  experimental: {
    dynamicIO: true,
  },
}

export default nextConfig

Функция cacheTag принимает одно строковое значение или массив строк.

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
}
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
}

Затем вы можете очистить кеш по требованию с помощью API revalidateTag в другой функции, например, в обработчике маршрутов или Server Action:

'use server'

import { revalidateTag } from 'next/cache'

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

import { revalidateTag } from 'next/cache'

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

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

  • Идемпотентные теги: Многократное применение одного и того же тега не имеет дополнительного эффекта.
  • Несколько тегов: Вы можете назначить несколько тегов одной записи кеша, передав массив в cacheTag.
cacheTag('tag-one', 'tag-two')

Примеры

Помечание компонентов или функций

Помечайте кешированные данные, вызывая cacheTag внутри кешированной функции или компонента:

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 //...
}
import { unstable_cacheTag as cacheTag } from 'next/cache'

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

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

  return //...
}

Создание тегов из внешних данных

Вы можете использовать данные, возвращенные из асинхронной функции, для пометки записи кеша.

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 //...
}
import { unstable_cacheTag as cacheTag } from 'next/cache'

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

Инвалидация помеченного кеша

Используя revalidateTag, вы можете инвалидировать кеш для конкретного тега, когда это необходимо:

'use server'

import { revalidateTag } from 'next/cache'

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

import { revalidateTag } from 'next/cache'

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