缓存页面、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 管理员 中的项目“缓存”部分管理缓存条目。
在开发环境中,请查看 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 小时。
需要注意的是,
在 Nitro 文档中阅读更多相关内容.
event
参数始终应该是缓存函数的第一个参数。Nitro 利用 event.waitUntil
在响应发送到客户端时保持实例处于活动状态,同时更新缓存。在 Nitro 文档中阅读更多相关内容.
缓存失效
使用 defineCachedFunction
或 defineCachedEventHandler
函数时,缓存键使用以下模式生成
`${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')
缓存过期
由于 NuxtHub 利用 Cloudflare Workers KV 存储您的缓存条目,因此我们利用 KV 绑定的 expiration
属性 来处理缓存过期。
如果将过期时间 (
maxAge
) 设置为小于 60
秒,则 NuxtHub 将在将来将 KV 条目过期时间设置为 60
秒(Cloudflare KV 限制),以便可以自动将其删除。