Skip to content

NextJS中文文档 - Use Cache

'use cache' 是一个 React 指令,允许你缓存评估返回值的结果,避免重复工作。当组件重新渲染或多个组件请求相同数据时,这可以提高性能。

jsx
import { longRunningOperation } from './operation'

function useData() {
  'use cache'
  return longRunningOperation()
}

export default function Page() {
  const data = useData()
  ...
}

何时使用

如果你对 TypeScript 中默认的行为不清楚,可以使用 use cache 明确指定函数的输出应该被缓存。这在以下情况下很有用:

  • 重复调用:避免在同一请求中多次调用同一函数时的重复工作
  • 数据需求重叠:当多个组件需要相同的数据时
  • 计算开销高:用于计算密集型任务的性能优化

工作原理

use cache 会缓存函数调用的结果,用它们的参数作为缓存键。相同参数的后续调用可以重用之前的结果,而不需要重新评估函数。

请记住:

  • 缓存具有请求范围,不会跨请求持久存在
  • 指令仅适用于在服务器上执行的代码
  • 它不是自动应用的——你必须明确添加 use cache 指令
  • 你可以在函数范围内的任何位置使用 use cache

示例

基本用法

下面的示例说明了 use cache 的简单使用场景:

jsx
function getPokemonName(id) {
  'use cache'
  console.log(`缓存未命中:获取神奇宝贝 #${id}`) // 演示缓存命中/未命中
  return fetchPokemonName(id) // 假设这是一个获取神奇宝贝的函数
}

export default function Page() {
  // 第一次调用 - 将执行函数
  const pokemon1 = getPokemonName(1)

  // 第二次使用相同的 ID - 将重用缓存的结果
  const pokemon1Again = getPokemonName(1)

  // 使用不同的 ID - 将执行函数
  const pokemon2 = getPokemonName(2)

  return (
    <div>
      <p>神奇宝贝 1: {pokemon1}</p>
      <p>相同神奇宝贝: {pokemon1Again}</p> {/* 缓存命中 */}
      <p>神奇宝贝 2: {pokemon2}</p>
    </div>
  )
}

组件之间共享数据

use cache 可以帮助避免多个组件请求相同数据时的冗余工作:

jsx
// 共享数据获取函数
function fetchPokemonData(id) {
  'use cache'
  console.log(`获取神奇宝贝 #${id} 数据`)
  return fetchFromDatabase(id) // 假设的数据库调用
}

// 使用共享数据获取的两个组件
export function PokemonName({ id }) {
  const pokemon = fetchPokemonData(id) // 重用缓存的结果
  return <h1>{pokemon.name}</h1>
}

export function PokemonStats({ id }) {
  const pokemon = fetchPokemonData(id) // 重用缓存的结果
  return (
    <ul>
      <li>攻击: {pokemon.attack}</li>
      <li>防御: {pokemon.defense}</li>
    </ul>
  )
}
jsx
import { PokemonName, PokemonStats } from '../components'

export default function PokemonPage({ params }) {
  const id = params.id

  return (
    <div>
      {/* 这两个组件共享同一个缓存的数据获取结果 */}
      <PokemonName id={id} />
      <PokemonStats id={id} />
    </div>
  )
}

兼容性与限制

  • use cache 只在服务器组件中工作
  • 该缓存限于当前请求的生命周期
  • 当使用传递函数参数时,来自相同函数但不同参数值的不同调用将有不同的缓存条目
  • 这主要是一个优化,不应该用于更改应用程序的行为

有关具体实现细节,请参考 React 文档

🎉有任何问题,欢迎联系我

WeChat QR Code
WeChat
QQ QR Code
QQ

赣ICP备2023003243号