# window.caches

  • 为Request/Response对象提供存储机制
  • 一个域可以有多个命名Cache对象
  • 在Service worker标准中被定义,但是它可以单独使用
  • 在Service worker标准中,CacheStorage是多个Cache的集合,每个Cache可以存储多个Response

浏览器支持

if('caches' in window) {
  // Has support!
}

打开缓存对象

通过caches.open可以异步得到一个Cache对象的引用,open返回Promise

window.caches.open('test').then(function(cache) {
    // 缓存创建完成,可以对cache进行操作了
});

添加缓存

使用cache.add | cache.addAll | cache.push

window.caches.open('test').then(function(cache) {
    cache.add('/page/1');  // '/page/1' 地址将被请求,响应数据将被缓存
    cache.add(new Request('/page/2', {/* 请求参数 */})); // 自定义Request
});
fetch('/page/1').then(function(response) {
    return caches.open('test').then(function(cache) {
        return cache.put('/page/1', response);
    });
});

访问缓存Request数据

使用cache.keys

caches.open('test').then(function(cache) { 
    cache.keys().then(function(cachedRequests) { 
        console.log(cachedRequests); // [Request, Request]
    });
});

/* 
Request {
	bodyUsed: false
	cache: "default"
	credentials: "omit"
	destination: ""
	headers: Headers {}
	integrity: ""
	isHistoryNavigation: false
	keepalive: false
	method: "GET"
	mode: "no-cors"
	redirect: "follow"
	referrer: ""
	referrerPolicy: "unsafe-url"
	signal: AbortSignal {
		aborted: false,
		onabort: null
	}
	url: "http://localhost:8033/page"
}
*/

访问缓存Response数据

使用cache.match

caches.open('test').then(function(cache) {
    cache.match('/page/1').then(function(matchedResponse) {
        console.log(matchedResponse);
    });
});

/*
Response {
	body: (...)
	bodyUsed: false
	headers: Headers {}
	ok: true
	redirected: false
	status: 200
	statusText: "OK"
	type: "basic"
	url: "http://localhost:8033/page"
}
*/

删除缓存中数据

使用cache.delete

caches.open('test').then(function(cache) {
    cache.delete('/page/1');
});

获取现有缓存对象

使用caches.keys

caches.keys().then(function(cacheKeys) {
    console.log(cacheKeys); // ['test']
})

删除缓存对象

使用caches.delete

caches.delete('test').then(function() {
    console.log('Cache test successfully deleted!');
})