详解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公共脚本库系列(一): 弹出层脚本
Feb 24 Javascript
查询json的数据结构的8种方式简介
Mar 10 Javascript
基于vue的下拉刷新指令和滚动刷新指令
Dec 23 Javascript
TypeScript入门-接口
Mar 30 Javascript
socket.io实现在线群聊功能
Apr 07 Javascript
layui弹出层效果实现代码
May 19 Javascript
基于JS对象创建常用方式及原理分析
Jun 28 Javascript
vue 微信授权登录解决方案
Apr 10 Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
May 28 jQuery
React 组件中的 bind(this)示例代码
Sep 16 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
Feb 16 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
Sep 04 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程序效率优化的一些策略小结
2010/07/17 PHP
PHP中的错误处理、异常处理机制分析
2012/05/07 PHP
解决Codeigniter不能上传rar和zip压缩包问题
2014/03/07 PHP
一些Javascript的IE和Firefox(火狐)兼容性的问题总结及常用例子
2009/05/21 Javascript
jquery关于页面焦点的定位(文本框获取焦点时改变样式 )
2010/09/10 Javascript
jsp js鼠标移动到指定区域显示选项卡离开时隐藏示例
2013/06/14 Javascript
js实现可拖动DIV的方法
2013/12/17 Javascript
JavaScript实现穷举排列(permutation)算法谜题解答
2014/12/29 Javascript
jquery图片滚动放大代码分享(2)
2015/08/28 Javascript
Bootstrap每天必学之前端开发框架
2015/11/19 Javascript
Js调用Java方法并互相传参的简单实例
2016/08/11 Javascript
Vue项目中quill-editor带样式编辑器的使用方法
2017/08/08 Javascript
基于VUE.JS的移动端框架Mint UI的使用
2017/10/11 Javascript
Vue不能观察到数组length的变化
2018/06/08 Javascript
Vue中在新窗口打开页面及Vue-router的使用
2018/06/13 Javascript
9102年webpack4搭建vue项目的方法步骤
2019/02/20 Javascript
如何使用webpack打包一个库library的方法步骤
2019/12/18 Javascript
vue 使用v-for进行循环的实例代码详解
2020/02/19 Javascript
原生js实现html手机端城市列表索引选择城市
2020/06/24 Javascript
Python模拟登录验证码(代码简单)
2016/02/06 Python
python 使用while写猜年龄小游戏过程解析
2019/10/07 Python
关于Python 常用获取元素 Driver 总结
2019/11/24 Python
Python编译成.so文件进行加密后调用的实现
2019/12/23 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
python标准库OS模块详解
2020/03/10 Python
世界各地的当地人的食物体验:Eatwith
2019/07/26 全球购物
什么是JNDI的上下文?如何初始化JNDI上下文
2012/03/10 面试题
会计学生自我鉴定
2014/02/06 职场文书
最经典的大学生职业生涯规划范文
2014/03/05 职场文书
体育课课后反思
2014/04/24 职场文书
2014年四风问题自我剖析材料
2014/09/15 职场文书
高校自主招生自荐信2015
2015/03/04 职场文书
美丽人生观后感
2015/06/03 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
公司劳动纪律管理制度
2015/08/04 职场文书
班主任寄语2016
2015/12/04 职场文书