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 相关文章推荐
JQuery UI皮肤定制
Jul 27 Javascript
js中各浏览器中鼠标按键值的差异
Apr 07 Javascript
防止xss和sql注入:JS特殊字符过滤正则
Apr 18 Javascript
script不刷新页面的联动前后代码
Sep 18 Javascript
JavaScript常用本地对象小结
Mar 28 Javascript
BootStrap初学者对弹出框和进度条的使用感觉
Jun 27 Javascript
AngularJS基础 ng-focus 指令简单示例
Aug 01 Javascript
移动端手指放大缩小插件与js源码
May 22 Javascript
页面内锚点定位及跳转方法总结(推荐)
Apr 24 Javascript
微信小程序实现卡片层叠滑动效果
Jun 21 Javascript
微信小程序引入模块中wxml、wxss、js的方法示例
Aug 09 Javascript
微信小程序自定义顶部组件customHeader的示例代码
Jun 03 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
一个查看session内容的函数
2006/10/09 PHP
php创建session的方法实例详解
2015/01/27 PHP
Yii框架学习笔记之应用组件操作示例
2019/11/13 PHP
php使用gearman进行任务分发操作实例详解
2020/02/26 PHP
html读出文本文件内容
2007/01/22 Javascript
JavaScript 入门·JavaScript 具有全范围的运算符
2007/10/01 Javascript
JS原型对象通俗"唱法"
2012/12/27 Javascript
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
JavaScript数组去重的两种方法推荐
2016/04/05 Javascript
浅析jquery unbind()方法移除元素绑定的事件
2016/05/24 Javascript
浅谈javascript:两种注释,声明变量,定义函数
2016/09/29 Javascript
URL中“#” “?” &“”号的作用浅析
2017/02/04 Javascript
利用jQuery实现滑动开关按钮效果(附demo源码下载)
2017/02/07 Javascript
关于JavaScript的单双引号嵌套问题
2017/08/20 Javascript
JS排序算法之希尔排序与快速排序实现方法
2017/12/12 Javascript
在create-react-app中使用sass的方法示例
2018/10/01 Javascript
微信小程序实现通过js操作wxml的wxss属性示例
2018/12/06 Javascript
vue项目打包之后背景样式丢失的解决方案
2019/01/17 Javascript
ES6之Proxy的get方法详解
2019/10/11 Javascript
[03:14]DOTA2斧王 英雄基础教程
2013/11/26 DOTA
python函数返回多个值的示例方法
2013/12/04 Python
Python多线程实现同步的四种方式
2017/05/02 Python
python 创建弹出式菜单的实现代码
2017/07/11 Python
浅谈Matplotlib简介和pyplot的简单使用——文本标注和箭头
2018/01/09 Python
浅谈python的dataframe与series的创建方法
2018/11/12 Python
python绘制双Y轴折线图以及单Y轴双变量柱状图的实例
2019/07/08 Python
django基于cors解决跨域请求问题详解
2019/08/06 Python
django项目登录中使用图片验证码的实现方法
2019/08/15 Python
基于HTML5超酷摄像头(HTML5 webcam)拍照功能实现代码
2012/12/13 HTML / CSS
HTML5实现晶莹剔透的雨滴特效
2014/05/14 HTML / CSS
The North Face北面美国官网:美国著名户外品牌
2018/09/15 全球购物
护士自荐信
2013/10/25 职场文书
生日礼品店创业计划书范文
2014/03/21 职场文书
幼儿园2015年度工作总结
2015/04/01 职场文书
开业典礼致辞
2015/07/29 职场文书
CSS中理解层叠性及权重如何分配
2022/12/24 HTML / CSS