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 相关文章推荐
Prototype Template对象 学习
Jul 19 Javascript
深入理解JavaScript作用域和作用域链
Oct 21 Javascript
JS.findElementById()使用介绍
Sep 21 Javascript
jQuery Html控件基本操作(日常收集整理)
Mar 11 Javascript
Bootstrap复选框和单选按钮美化插件(推荐)
Nov 23 Javascript
JavaScript实现无穷滚动加载数据
May 06 Javascript
除Console.log()外更多的Javascript调试命令
Jan 24 Javascript
tween.js缓动补间动画算法示例
Feb 13 Javascript
Node.Js中实现端口重用原理详解
May 03 Javascript
Koa代理Http请求的示例代码
Oct 10 Javascript
Angular使用ControlValueAccessor创建自定义表单控件
Mar 08 Javascript
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
Aug 23 Javascript
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
用PHP实现文件上传二法
2006/10/09 PHP
php中session退出登陆问题
2014/02/27 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
2018/04/21 PHP
JavaScript CSS修改学习第一章 查找位置
2010/02/19 Javascript
始终在屏幕中间显示Div的代码(css+js)
2011/03/10 Javascript
document.all的一个比较完整的总结及案例
2013/01/31 Javascript
获取鼠标在div中的相对位置的实现代码
2013/12/30 Javascript
Javascript中的关键字和保留字整理
2014/10/16 Javascript
React-intl 实现多语言的示例代码
2017/11/03 Javascript
如何为你的JavaScript代码日志着色详解
2019/04/08 Javascript
vue 引用自定义ttf、otf、在线字体的方法
2019/05/09 Javascript
layui switch 开关监听 弹出确定状态转换的例子
2019/09/21 Javascript
JavaScript this指向相关原理及实例解析
2020/07/10 Javascript
解决vux 中popup 组件Mask 遮罩在最上层的问题
2020/11/03 Javascript
Python上传package到Pypi(代码简单)
2016/02/06 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
2017/05/03 Python
Python使用defaultdict读取文件各列的方法
2017/05/11 Python
python简单图片操作:打开\显示\保存图像方法介绍
2017/11/23 Python
numpy数组拼接简单示例
2017/12/15 Python
Python3.5内置模块之time与datetime模块用法实例分析
2019/04/27 Python
python提取log文件内容并画出图表
2019/07/08 Python
Python学习笔记之字符串和字符串方法实例详解
2019/08/22 Python
使用python把xmind转换成excel测试用例的实现代码
2020/10/12 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
2020/10/22 Python
基于PyTorch中view的用法说明
2021/03/03 Python
Europcar德国:全球汽车租赁领域的领导者
2018/08/15 全球购物
zooplus波兰:在线宠物店
2019/07/21 全球购物
AJax面试题
2014/11/25 面试题
管理失职检讨书
2014/02/12 职场文书
税务会计岗位职责
2014/02/18 职场文书
企业精细化管理实施方案
2014/03/23 职场文书
物流管理专业毕业生求职信
2014/03/23 职场文书
工作说明书格式
2014/07/29 职场文书
2014年库房工作总结
2014/11/26 职场文书
民事诉讼答辩状范文
2015/05/21 职场文书
2019年中,最受大众欢迎的6本新书
2019/08/07 职场文书