详解Javascript获取缓存和清除缓存API


Posted in Javascript onMay 25, 2017

JavaScript ServiceWorker API的好处就是让web开发人员轻松的控制缓存。虽然使用ETags等技术也是一种控制缓存的技术,按使用JavaScript让程序来控制缓存功能更强大,更自由。当然,强大有强大的好处,也有弊处——你需要做善后处理,所谓的善后处理,就是要清理缓存。

下面我们来看看如何创建缓存对象、在缓存里添加请求缓存数据,从缓存里删除请求缓存的数据,最后是如何完全的删除缓存。

判断浏览器对缓存对象cache API的支持

检查浏览器是否支持Cache API…

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

…检查window里是否存在caches对象。

创建一个缓存对象

创建一个缓存对象的方法是使用caches.open(),并传入缓存的名称:

caches.open('test-cache').then(function(cache) {
 // 缓存创建完成,现在就可以访问了
});

这个caches.open方法返回一个Promise,其中的cache对象新创建出来,如果是以前创建过,就不重新创建。

添加缓存数据

对于这类的缓存,你可以把它想象成一个Request对象数组,Request请求获取的响应数据将会按键值存储在缓存对象里。有两个方法可以往缓存里添加数据:add 和 addAll。用这两个方法将要缓存的请求的地址添加进去。关于Request对象的介绍你可以参考fetch API这篇文章。

使用addAll方法可以批量添加缓存请求:

caches.open('test-cache').then(function(cache) { 
 cache.addAll(['/', '/images/logo.png'])
  .then(function() { 
   // Cached!
  });
});

这个addAll方法可以接受一个地址数组作为参数,这些请求地址的响应数据将会被缓存在cache对象里。addAll返回的是一个Promise。添加单个地址使用add方法:

caches.open('test-cache').then(function(cache) {
 cache.add('/page/1'); // "/page/1" 地址将会被请求,响应数据会缓存起来。
});
add()方法还可以接受一个自定义的Request:

caches.open('test-cache').then(function(cache) {
 cache.add(new Request('/page/1', { /* 请求参数 */ }));
});
//跟add()方法很相似,put()方法也可以添加请求地址,同时添加它的响应数据:

fetch('/page/1').then(function(response) {
 return caches.open('test-cache').then(function(cache) {
  return cache.put('/page/1', response);
 });
});

访问缓存数据

要查看已经换的请求数据,我们可以使用缓存对象里的keys()方法来获取所有缓存Request对象,以数组形式:

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

/*
Request {
 bodyUsed: false
 credentials: "omit"
 headers: Headers
 integrity: ""
 method: "GET"
 mode: "no-cors"
 redirect: "follow"
 referrer: ""
 url: "http://www.webhek.com/images/logo.png"
}
*/

如果你想查看缓存的Request请求的响应内容,可以使用cache.match()或cache.matchAll()方法:

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

/*
Response {
 body: (...),
 bodyUsed: false,
 headers: Headers,
 ok: true,
 status: 200,
 statusText: "OK",
 type: "basic",
 url: "https://www.webhek.com/page/1"
}
*/

关于Response对象的用法和详细信息,你可以参考fetch API这篇文章。

删除缓存里的数据

从缓存里删除数据,我们可以使用cache对象里的delete()方法:

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

这样,缓存里将不再有/page/1请求数据。

获取现有的缓存里的缓存名称

想要获取缓存里已经存在的缓存数据的名称,我们需要使用caches.keys()方法:

caches.keys().then(function(cacheKeys) { 
 console.log(cacheKeys); // ex: ["test-cache"]
});

window.caches.keys()返回的也是一个Promise。

删除一个缓存对象

想要删除一个缓存对象,你只需要缓存的键名即可:

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

大量删除旧缓存数据的方法:

// 假设`CACHE_NAME`是新的缓存的名称
// 现在清除旧的缓存
var CACHE_NAME = 'version-8';

// ...

caches.keys().then(function(cacheNames) {
 return Promise.all(
  cacheNames.map(function(cacheName) {
   if(cacheName != CACHE_NAME) {
    return caches.delete(cacheName);
   }
  })
 );
});

想成为一个service worker专家?上面的这些代码值得放到你的储备库里。火狐浏览器和谷歌浏览器都支持service worker,相信很快就会有更多的网站、app使用这种缓存技术来提高运行速度。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
Javascript开发之三数组对象实例介绍
Nov 12 Javascript
window.navigate 与 window.location.href 的使用区别介绍
Sep 21 Javascript
Angularjs中如何使用filterFilter函数过滤
Feb 06 Javascript
JS实现的系统调色板完整实例
Dec 21 Javascript
Vue.js双向绑定操作技巧(初级入门)
Dec 27 Javascript
JavaScript数据结构之二叉树的查找算法示例
Apr 13 Javascript
AngularJS 实现点击按钮获取验证码功能实例代码
Jul 13 Javascript
深入理解ES7的async/await的用法
Sep 09 Javascript
JavaScript类数组对象转换为数组对象的方法实例分析
Jul 24 Javascript
轻松解决JavaScript定时器越走越快的问题
May 13 Javascript
JS实现灯泡开关特效
Mar 30 Javascript
原生JavaScript创建不可变对象的方法简单示例
May 07 Javascript
Angularjs 实现动态添加控件功能
May 25 #Javascript
JavaScript实现自动跳转文本功能
May 25 #Javascript
angularjs项目的页面跳转如何实现(5种方法)
May 25 #Javascript
AngularJS基于factory创建自定义服务的方法详解
May 25 #Javascript
AngularJS读取JSON及XML文件的方法示例
May 25 #Javascript
bootstrap+jQuery实现的动态进度条功能示例
May 25 #jQuery
基于VUE选择上传图片并页面显示(图片可删除)
May 25 #Javascript
You might like
PHP Socket 编程
2010/04/09 PHP
解析左右值无限分类的实现算法
2013/06/20 PHP
php实现点击可刷新验证码
2015/11/07 PHP
window.addeventjs事件驱动函数集合addEvent等
2008/02/19 Javascript
奉献给JavaScript初学者的编写开发的七个细节
2011/01/11 Javascript
Jquery实现带动画效果的经典二级导航菜单
2013/03/22 Javascript
利用javaScript实现点击输入框弹出窗体选择信息
2013/12/11 Javascript
使用apply方法实现javascript中的对象继承
2013/12/16 Javascript
jqGrid随窗口大小变化自适应大小的示例代码
2013/12/28 Javascript
JQuery+Ajax无刷新分页的实例代码
2014/02/08 Javascript
javascript跨域原因以及解决方案分享
2015/04/08 Javascript
jquery基础知识第一讲之认识jquery
2016/03/17 Javascript
完美解决jQuery的hover事件在IE中不停闪动的问题
2017/02/10 Javascript
easyui-datagrid特殊字符不能显示的处理方法
2017/04/12 Javascript
Angular 4依赖注入学习教程之简介(一)
2017/06/04 Javascript
BootStrap Validator 根据条件在JS中添加或移除校验操作
2017/10/12 Javascript
JS左右无缝轮播功能完整实例
2019/05/16 Javascript
解决微信小程序scroll-view组件无横向滚动的问题
2020/02/04 Javascript
JavaScript变量Dom对象的所有属性
2020/04/30 Javascript
[46:49]完美世界DOTA2联赛PWL S3 access vs Rebirth 第二场 12.19
2020/12/24 DOTA
Python随机生成一个6位的验证码代码分享
2015/03/24 Python
python列表生成式与列表生成器的使用
2018/02/23 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
2018/06/13 Python
python库skimage给灰度图像染色的方法示例
2020/04/27 Python
关于tf.matmul() 和tf.multiply() 的区别说明
2020/06/18 Python
Python 如何实现访问者模式
2020/07/28 Python
Boden英国官网:英国知名原创时装品牌
2018/11/06 全球购物
阿巴庭院:Abba Patio
2019/06/18 全球购物
设计专业毕业生求职信
2014/06/25 职场文书
党员对照检查材料整改措施思想汇报
2014/09/26 职场文书
2014年向国旗敬礼活动方案
2014/09/27 职场文书
出国签证在职证明范本
2014/11/24 职场文书
优秀共青团员事迹材料
2014/12/25 职场文书
幼儿园百日安全活动总结
2015/05/07 职场文书
详解如何使用Nginx解决跨域问题
2022/05/06 Servers
GoFrame基于性能测试得知grpool使用场景
2022/06/21 Golang