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 相关文章推荐
js跟随滚动条滚动浮动代码
Dec 31 Javascript
动态显示可输入的字数提示还可以输入的字数
Apr 01 Javascript
jQuery事件处理的特征(事件命名机制)
Aug 23 Javascript
BootStrap入门教程(二)之固定的内置样式
Sep 19 Javascript
前端 Vue.js 和 MVVM 详细介绍
Dec 29 Javascript
JavaScript实现图片无缝滚动效果
Jul 07 Javascript
jquery如何实现点击空白处隐藏元素
Dec 05 jQuery
VUE2.0+Element-UI+Echarts封装的组件实例
Mar 02 Javascript
vue打包的时候自动将px转成rem的操作方法
Jun 20 Javascript
详解vue-cli3开发Chrome插件实践
May 29 Javascript
JavaScript前端实现压缩图片功能
Mar 06 Javascript
javascript的var与let,const之间的区别详解
Feb 18 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
239军机修复记
2021/03/02 无线电
模拟OICQ的实现思路和核心程序(三)
2006/10/09 PHP
php横向重复区域显示二法
2008/09/25 PHP
破解.net程序(dll文件)编译和反编译方法
2013/01/31 PHP
PHP中JSON的应用技巧
2015/10/10 PHP
PHP的Yii框架的常用日志操作总结
2015/12/08 PHP
深入理解PHP原理之执行周期分析
2016/06/01 PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
2017/02/24 PHP
php-fpm服务启动脚本的方法
2018/04/27 PHP
PHP的PDO连接讲解
2019/01/24 PHP
js用typeof方法判断undefined类型
2014/07/15 Javascript
JavaScript中Textarea滚动条不能拖动的解决方法
2015/12/15 Javascript
Angularjs全局变量被作用域监听的正确姿势
2016/02/06 Javascript
JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解
2016/05/31 Javascript
vue初尝试--项目结构(推荐)
2018/01/30 Javascript
JS pushlet XMLAdapter适配器用法案例解析
2020/10/16 Javascript
[00:26]TI7不朽珍藏III——冥界亚龙不朽展示
2017/07/15 DOTA
[23:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
python基于multiprocessing的多进程创建方法
2015/06/04 Python
使用pyecharts无法import Bar的解决方案
2020/04/23 Python
Python学习pygal绘制线图代码分享
2017/12/09 Python
pytorch 状态字典:state_dict使用详解
2020/01/17 Python
flask框架url与重定向操作实例详解
2020/01/25 Python
浅谈Python线程的同步互斥与死锁
2020/03/22 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
简述python Scrapy框架
2020/08/17 Python
GitHub上值得推荐的8个python 项目
2020/10/30 Python
HTML5 Canvas绘制五星红旗
2016/05/04 HTML / CSS
英语专业推荐信
2013/11/16 职场文书
秋季运动会广播稿大全
2014/02/17 职场文书
市场营销调查计划书
2014/05/02 职场文书
2015年上半年党建工作总结
2015/03/30 职场文书
毕业实习感受与体会
2015/05/26 职场文书
描写九月优美句子(39条)
2019/09/11 职场文书
node.js如何自定义实现一个EventEmitter
2021/07/16 Javascript
使用CSS实现音波加载效果
2023/05/07 HTML / CSS