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 相关文章推荐
extJs 常用到的增,删,改,查操作代码
Dec 28 Javascript
javascript实现相同事件名称,不同命名空间的调用方法
Jun 26 Javascript
jQuery实现的仿select功能代码
Aug 19 Javascript
js文本框走动跑马灯效果代码分享
Aug 25 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
Sep 06 Javascript
node.js插件nodeclipse安装图文教程
Oct 19 Javascript
Node.js的npm包管理器基础使用教程
May 26 Javascript
Javascript 6里的4个新语法
Aug 25 Javascript
微信小程序调用PHP后台接口 解析纯html文本
Jun 13 Javascript
jQuery实现的电子时钟效果完整示例
Apr 28 jQuery
详解vue.js根据不同环境(正式、测试)打包到不同目录
Jul 13 Javascript
Vue + Element UI图片上传控件使用详解
Aug 20 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脚本的10个技巧(8)
2006/10/09 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
2014/05/29 PHP
destoon供应信息title调用出公司名称的方法
2014/08/22 PHP
浅谈Laravel中的三种中间件的作用
2019/10/13 PHP
NiftyCube——轻松实现圆角边框
2007/02/20 Javascript
javascript得到XML某节点的子节点个数的脚本
2008/10/11 Javascript
javascript 写类方式之三
2009/07/05 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
jQuery中parentsUntil()方法用法实例
2015/01/07 Javascript
js分页工具实例
2015/01/28 Javascript
jquery dataview数据视图插件使用方法
2016/12/23 Javascript
jQuery中on方法使用注意事项详解
2017/02/15 Javascript
React学习笔记之条件渲染(一)
2017/07/02 Javascript
JS实现点击循环切换显示内容的方法
2017/10/19 Javascript
JS页面动态绘图工具SVG,Canvas,VML介简介
2020/10/16 Javascript
[02:30]DOTA2放量测试专访海涛:呼吁保护新手玩家
2013/08/26 DOTA
Python中的高级函数map/reduce使用实例
2015/04/13 Python
使用Python脚本将绝对url替换为相对url的教程
2015/04/24 Python
Python多进程分块读取超大文件的方法
2016/04/13 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
2018/03/19 Python
Python 实现文件读写、坐标寻址、查找替换功能
2019/09/11 Python
python 代码运行时间获取方式详解
2020/09/18 Python
CSS3 Columns分列式布局方法简介
2014/05/03 HTML / CSS
一款css实现的鼠标经过按钮的特效
2014/09/11 HTML / CSS
里程积分管理买卖交换平台:Points.com
2017/01/13 全球购物
销售主管的自我评价分享
2014/01/03 职场文书
业务部主管岗位职责
2014/01/29 职场文书
收银员岗位职责
2014/02/07 职场文书
怎样拟定创业计划书
2014/05/01 职场文书
作风建设年活动总结
2014/08/27 职场文书
2015年领班工作总结
2015/04/29 职场文书
教师聘用意向书
2015/05/11 职场文书
2015年计算机教学工作总结
2015/07/22 职场文书
《敬重卑微》读后感3篇
2019/11/26 职场文书
SqlServer: 如何更改表的文件组?(进而改变存储位置)
2021/04/05 SQL Server
Python中文纠错的简单实现
2021/07/07 Python