Javascript缓存API


Posted in Javascript onJune 14, 2016

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 相关文章推荐
使用CSS和jQuery模拟select并附提交后取得数据的代码
Oct 18 Javascript
DOM节点删除函数removeChild()用法实例
Jan 12 Javascript
jQuery获取cookie值及删除cookie用法实例
Apr 15 Javascript
javascript三种代码注释方法
Jun 02 Javascript
jQuery实现的简单排序功能示例【冒泡排序】
Jan 13 Javascript
详解JavaScript调用栈、尾递归和手动优化
Jun 03 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
Jul 10 Javascript
vue.js 底部导航栏 一级路由显示 子路由不显示的解决方法
Mar 09 Javascript
Javascript的console['']常用输入方法汇总
Apr 26 Javascript
Vue中props的详解
May 16 Javascript
微信小程序云开发详细教程
May 16 Javascript
vue-router中hash模式与history模式的区别
Jun 23 Vue.js
JS修改地址栏参数实例代码
Jun 14 #Javascript
JS获取地址栏参数的两种方法(简单实用)
Jun 14 #Javascript
Javascript基础_嵌入图像的简单实现
Jun 14 #Javascript
jQuery实例—选项卡的简单实现(js源码和jQuery)
Jun 14 #Javascript
浅析JS获取url中的参数实例代码
Jun 14 #Javascript
Javascript基础_标记文字的实现方法
Jun 14 #Javascript
深入浅析JavaScript的API设计原则
Jun 14 #Javascript
You might like
Smarty Foreach 使用说明
2010/03/23 PHP
LotusPhp笔记之:Cookie组件的使用详解
2013/05/06 PHP
yii2 resetful 授权验证详解
2017/05/18 PHP
基于jQuery的前端数据通用验证库
2011/08/08 Javascript
给jQuery方法添加回调函数一款插件的应用
2013/01/21 Javascript
JS获取鼠标坐标的实例方法
2013/07/18 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
JavaScript中的object转换函数toString()与valueOf()介绍
2014/12/31 Javascript
jQuery结合HTML5制作的爱心树表白动画
2015/02/01 Javascript
Jquery 分页插件之Jquery Pagination
2015/08/25 Javascript
基于javascript实现窗口抖动效果
2016/01/03 Javascript
Bootstrap图片轮播组件Carousel使用方法详解
2016/10/20 Javascript
快速掌握jQuery插件开发
2017/01/19 Javascript
微信小程序 本地数据存储实例详解
2017/04/13 Javascript
基于jQuery实现可编辑的表格
2019/12/11 jQuery
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
通过代码实例展示Python中列表生成式的用法
2015/03/31 Python
python中私有函数调用方法解密
2016/04/29 Python
用python找出那些被“标记”的照片
2017/04/20 Python
python3.6使用pickle序列化class的方法
2018/10/22 Python
Python实现将Excel转换成为image的方法
2018/10/23 Python
PyTorch实现重写/改写Dataset并载入Dataloader
2020/07/14 Python
超酷炫 CSS3垂直手风琴菜单
2016/06/28 HTML / CSS
phpquery中文手册
2021/03/18 PHP
屈臣氏俄罗斯在线商店:Watsons俄罗斯
2020/08/03 全球购物
C/C++程序员常见面试题二
2015/11/19 面试题
制药工程专业毕业生推荐信
2013/12/24 职场文书
乡镇信息公开实施方案
2014/03/23 职场文书
工程材料采购方案
2014/05/18 职场文书
服务宗旨标语
2014/07/01 职场文书
2015年部门工作总结范文
2015/03/31 职场文书
多人股份制合作协议书
2016/03/19 职场文书
建房合同协议书
2016/03/21 职场文书
用Python可视化新冠疫情数据
2022/01/18 Python
5个实用的JavaScript新特性
2022/06/16 Javascript
关于对TypeScript泛型参数的默认值理解
2022/07/15 Javascript