Cache API 是 Service Worker 规范的一部分,是一种增强资源缓存能力的好方法。
它允许你缓存 URL 可寻址资源,这意味着资源、网页、HTTP API 响应。
它并不意味着缓存单个数据块,这是 IndexedDB API 的任务。
Cache API 通过 caches 对象公开。要检测 API 是否在浏览器中实现,只需使用以下命令检查其是否存在:
if ('caches' in window) {
console.log('支持 Cache API')
}使用 caches.open API,它返回一个带有缓存对象的 Promise 以供使用:
caches.open('my-cache').then((cache) => {
// 你可以开始使用缓存
})
// or
const cache = await caches.open('my-cache')my-cache 是我用来标识要初始化的缓存的名称。它就像一个变量名,你可以使用任何你想要的名字。
如果缓存尚不存在,caches.open 则创建它。
cache 对象公开了两个将项目添加到缓存的方法:add 和 addAll。
add 接受单个 URL,并在调用时获取资源并缓存它。
const cache = await caches.open('my-cache')
cache.add('/api/todos')Tips:你可以使用 JSONPlaceholder 进行测试。
为了允许对获取进行更多控制,你可以传递一个 Request 对象,而不是字符串,它是 Fetch API 规范的一部分:
const cache = await caches.open('my-cache')
cache.add(
new Request('/api/todos', {
// the options
})
)addAll 接受一个数组,并在所有资源都被缓存后返回一个 Promise。
const cache = await caches.open('my-cache')
// 所有请求都已缓存
const allCache = await cache.addAll(['/api/todos', '/api/todos/today'])cache.add() 自动获取资源并将其缓存。
Cache API 通过 cache.put() 对此提供了更细粒度的控制。你负责获取资源,然后告诉 Cache API 存储一个响应:
const url = '/api/todos'
const res = await fetch(url)
const cache = await caches.open('my-cache')
cache.put(url, res)如果需要从缓存中检索项目,可以使用 cache.match() 或 matchAll(),它们返回一个 Response 对象,其中包含有关请求的所有信息和网络请求的响应。
const cache = await caches.open('my-cache')
// res 是响应对象
const res = await cache.match('/api/todos')cache.match() 返回第一个匹配请求相关联的 Response,而 matchAll() 返回所有匹配请求的数组。
caches.keys() 方法列出了每个可用缓存的键。
// keys 是一个包含键列表的数组
const keys = await caches.keys()const cache = await caches.open('my-cache')
const cachedItems = await cache.keys()cachedItems 是一个 Request 对象数组,其中包含 url 属性中资源的 URL。
caches.delete() 方法接受一个缓存标识符,并在执行时从系统中清除缓存及其缓存项。
caches.delete('my-cache').then(() => {
console.log('已成功删除')
})给定一个 cache 对象,其 delete() 方法将从中删除缓存的资源。
caches.open('my-cache').then((cache) => {
cache.delete('/api/todos')
})