缓存页面、API 和函数

了解如何使用 NuxtHub 缓存存储缓存 Nuxt 页面、API 路由和函数。

入门

通过在您的 nuxt.config.ts 文件的 hub 对象中添加 cache 属性,在您的 NuxtHub 项目中启用缓存存储。

nuxt.config.ts
export default defineNuxtConfig({
  hub: {
    cache: true
  }
})
此选项将配置 Nitro 的缓存存储 以使用 Cloudflare Workers KV,并在您部署项目时为您的项目创建一个新的存储命名空间。

部署 Nuxt 项目后,您可以在 NuxtHub 管理员 中的项目“缓存”部分管理缓存条目。

NuxtHub Admin Cache

在开发环境中,请查看 Nuxt Devtools 中的 Hub 缓存部分。

API 路由缓存

要缓存 Nuxt API 和服务器路由,请使用 cachedEventHandler 函数。此函数将服务器路由的响应缓存到缓存存储中。

server/api/cached-route.ts
import type { H3Event } from 'h3'

export default cachedEventHandler((event) => {
  return {
    success: true,
    date: new Date().toISOString()
  }
}, {
  maxAge: 60 * 60, // 1 hour
  getKey: (event: H3Event) => event.path
})

上面的示例将 /api/cached-route 路由的响应缓存 1 小时。 getKey 函数用于生成缓存条目的键。

阅读更多关于 Nitro 缓存选项

服务器函数缓存

使用 cachedFunction 函数,您可以根据传递给函数的参数缓存服务器函数的响应。

这对于缓存在多个 API 路由或经过身份验证的路由中使用的函数的结果很有用。
server/utils/cached-function.ts
import type { H3Event } from 'h3'

export const getRepoStarCached = defineCachedFunction(async (event: H3Event, repo: string) => {
  const data: any = await $fetch(`https://api.github.com/repos/${repo}`)

  return data.stargazers_count
}, {
  maxAge: 60 * 60, // 1 hour
  name: 'ghStars',
  getKey: (event: H3Event, repo: string) => repo
})

上面的示例将 getRepoStarCached 函数的结果缓存 1 小时。

需要注意的是, event 参数始终应该是缓存函数的第一个参数。Nitro 利用 event.waitUntil 在响应发送到客户端时保持实例处于活动状态,同时更新缓存。
在 Nitro 文档中阅读更多相关内容.

缓存失效

使用 defineCachedFunctiondefineCachedEventHandler 函数时,缓存键使用以下模式生成

`${options.group}:${options.name}:${options.getKey(...args)}.json`

默认值为

  • group: 'nitro'
  • name: API 路由为 'handlers',服务器函数为 'functions'

例如,以下函数

const getAccessToken = defineCachedFunction(() => {
  return String(Date.now())
}, {
  maxAge: 10,
  name: 'getAccessToken',
  getKey: () => 'default'
})

将生成以下缓存键

nitro:functions:getAccessToken:default.json

您可以使用以下命令使缓存的函数条目失效

await useStorage('cache').removeItem('nitro:functions:getAccessToken:default.json')
阅读更多关于 Nitro 缓存。

缓存过期

由于 NuxtHub 利用 Cloudflare Workers KV 存储您的缓存条目,因此我们利用 KV 绑定的 expiration 属性 来处理缓存过期。

如果将过期时间 (maxAge) 设置为小于 60 秒,则 NuxtHub 将在将来将 KV 条目过期时间设置为 60 秒(Cloudflare KV 限制),以便可以自动将其删除。