创建缓存 API 是为了允许 Service Workers 对资源的缓存进行更深入和细粒度的控制。
通过缓存 API,Service Worker 可以决定缓存资源以供离线使用并在以后检索它们。
对于资源,我们指的是来自 URL 的完整响应,例如 HTML 页面、CSS、JavaScript 文件、图像、JSON 以及您的网页或 Web 应用程序可以使用的任何其他资源。
浏览器支持
如果不详细说明支持哪些浏览器,就无法谈论最近的 Web 技术。
在 Cache API 的情况下,我们谈论的是:
- Firefox 39 及更高版本
- 铬 40 及更高版本
- Opera 29 及更高版本
- Safari 11.1 及更高版本
- iOS Safari 11.4 及更高版本
- Edge 17 及更高版本
- UC 浏览器 11.8 及更高版本
- 适用于 Android 67 及更高版本的 Chrome
不支持 Internet Explorer。
除了 Firefox 和 Chrome,最近才真正引入了其他浏览器的支持,所以你应该记住这一点。
如果您计划支持的不仅仅是运行上述浏览器的人,您的站点和应用程序应该在此检查中包含任何缓存 API 代码:
if ('caches' in window) {
// The Cache API is supported
// You can add your code here
}
使用缓存
if ('caches' in window) {
// The Cache API is supported
const cacheName = 'my-website-cache'
caches.open(cacheName).then(cache => {
// you can start using the cache
})
}
缓存链接到当前源(域),出于安全和隐私原因,您无法访问为其他人设置的缓存。
您可以设置几个不同的缓存。 要查看为当前原点设置的所有缓存,您可以遍历 caches.keys():
caches.keys().then(keys => {
keys.map(key => {
console.log(key)
})
})
您可以通过调用 delete() 方法删除一个缓存:
const cacheName = 'my-website-cache'
caches.delete(cacheName).then(() => {
console.log('Cache deleted')
})
添加到缓存
我们有3种方法:
cache.put()cache.add()cache.addAll()
您在 fetch() 调用的成功承诺回调中调用 cache.put() :
const cacheName = 'my-website-cache'
const url = '/resource'
fetch(url).then(res => {
return caches.open(cacheName).then(cache => {
return cache.put(url, res)
})
})
使用 cache.add(),您不必在将资源添加到缓存之前手动获取资源:缓存 API 会自动为您完成此操作。
const cacheName = 'my-website-cache'
const url = '/resource'
caches.open(cacheName).then(cache => {
cache.add(url).then(() => {
//done!
}
})
在这种情况下,在调用 cache.add() 之后,将向服务器发送 Fetch 请求,并缓存响应。
cache.addAll() 用于执行对多个 URL 的请求。 回调函数只有在所有资源都被获取和缓存后才会被调用:
const cacheName = 'my-website-cache'
const url1 = '/resource1'
const url2 = '/resource2'
caches.open(cacheName).then(cache => {
cache.addAll([url1, url2]).then(() => {
//all requests were cached
})
})
从缓存中检索
使用 cache.match() 您可以获得与您的查询匹配的 URL 对应的 Response 对象:
const cacheName = 'my-website-cache'
const url = '/resource'
caches.open(cacheName).then(cache => {
cache.match(url).then(item => {
console.log(item)
}
})
item 是一个 Request 对象,您可以对其进行检查,例如,您可以使用 item.url 获取 URL。
遍历缓存中的所有项目
使用 cache.keys() 您可以获取缓存中存在的所有项目,并对其进行迭代:
const cacheName = 'my-website-cache'
const url = '/resource'
caches.open(cacheName).then(cache => {
cache.keys().then(items => {
items.map(item => {
console.log(item)
})
}
})
每个项目都是一个 Request 对象。
从缓存中删除项目
将资源添加到缓存后,它会占用浏览器存储空间中的一些空间。 您可以手动清除通过原始 URL 存储的任何内容,将其传递给 cache.delete() 方法:
const cacheName = 'my-website-cache'
const url = '/resource'
caches.open(cacheName).then(cache => {
cache.delete(url).then(() => {
//deleted successfully!
}
})