javascript客户端解决方案 缓存提供程序


Posted in Javascript onJuly 14, 2010

相信每一个开发者都知道缓存的重要性。从头至尾有缓存的后台(memcached,xcache等。) 来减轻db的压力。对内容分发网络(CDN)缓存中希望你的浏览器缓存那些不止一次的加载资源。当然, 有客户端缓存,所以你不要重复昂贵的操作(即使是算法或大量的运算)。

这是介绍的是一个不错的javascript的方面的客户端解决方案,可选配支持HTML5本地存储器.

Starting Simple

function CacheProvider() { 
// values will be stored here 
this._cache = {}; 
}Feature detect on local storage 
try { 
CacheProvider.hasLocalStorage = ('localStorage' in window) && window['localStorage'] !== null; 
} catch (ex) { 
CacheProvider.hasLocalStorage = false; 
}

这里使用try catch的主要原因是 尽管firefox支持该属性,但是需要在about:config中设置并开启,否则将会报错。所以一个简单的if else不能满足需求。

下面我们将增加对象本地存储机制的支持。这个技术是借鉴了Christopher Blizzard的一篇不错的文章 Saving data with local storage ? for which those who didn't know, you can only store string's into local storage. Thus we have this…

in / out JSON parsing

if (CacheProvider.hasLocalStorage) { 
Storage.prototype.setObject = function(key, value) { 
this.setItem(key, JSON.stringify(value)); 
}; Storage.prototype.getObject = function(key) { 
return JSON.parse(this.getItem(key)); 
}; 
}

现在就到了我们的三个核心方法了,分别是 get, set, 和clear.

Core class functionality

CacheProvider.prototype = { /** 
* {String} k - the key 
* {Boolean} local - get this from local storage? 
* {Boolean} o - is the value you put in local storage an object? 
*/ 
get: function(k, local, o) { 
if (local && CacheProvider.hasLocalStorage) { 
var action = o ? 'getObject' : 'getItem'; 
return localStorage[action](k) || undefined; 
} else { 
return this._cache[k] || undefined; 
} 
}, 
/** 
* {String} k - the key 
* {Object} v - any kind of value you want to store 
* however only objects and strings are allowed in local storage 
* {Boolean} local - put this in local storage 
*/ 
set: function(k, v, local) { 
if (local && CacheProvider.hasLocalStorage) { 
if (typeof v !== 'string')) { 
// make assumption if it's not a string, then we're storing an object 
localStorage.setObject(k, v); 
} else { 
try { 
localStorage.setItem(k, v); 
} catch (ex) { 
if (ex.name == 'QUOTA_EXCEEDED_ERR') { 
// developer needs to figure out what to start invalidating 
throw new Exception(v); 
return; 
} 
} 
} 
} else { 
// put in our local object 
this._cache[k] = v; 
} 
// return our newly cached item 
return v; 
}, 
/** 
* {String} k - the key 
* {Boolean} local - put this in local storage 
* {Boolean} o - is this an object you want to put in local storage? 
*/ 
clear: function(k, local, o) { 
if (local && CacheProvider.hasLocalStorage) { 
localStorage.removeItem(k); 
} 
// delete in both caches - doesn't hurt. 
delete this._cache[k]; 
} 
};

如何运用?
注意在这篇文章的开始,就说了Cache Provider 是可选支配的本地存储,首先然让我们看一个没有本地存储的例子:

getElementsByClassName

var cache = new CacheProvider; window.getElementsByClassName = getElementsByClassName || function(c) { 
var reg = cache.get(c) || cache.set(c, new RegExp("(?:^|s+)" + c + "(?:s+|$)")); 
var elements = document.getElementsByTagName('*'); 
var results = []; 
for (var i = 0; i < elements.length; i++) { 
if (elements[i].className.match(reg)) { 
results.push(elements[i]); 
} 
} 
return results; 
};

备注:下次你调用类函数的时候, 将会用预先编译好的正则表达式替代够建造一个表达式。

再举一个例子:比如 对于大的应用程序需要i18n,你可以缓存一个编译好的html字符串进入本地存储中。

var i18nCache = new CacheProvider; if (i18nCache.get('topnav')) { 
$('#nav').html(i18nCache.get('topnav')); 
} else { 
ajax('top-nav.tmpl', function(html) { 
i18nCache.set('topnav', html); 
$('#nav').html(i18nCache.get('topnav')); 
}); 
}

除此之外,你开可以做很多外部资源缓存到本地的事情,加油:)
Javascript 相关文章推荐
调试代码导致IE出错的避免方法
Apr 04 Javascript
关于事件mouseover ,mouseout ,mouseenter,mouseleave的区别
Oct 12 Javascript
详解javascript高级定时器
Dec 31 Javascript
AngularJS 入门教程之事件处理器详解
Aug 19 Javascript
微信小程序 引入es6 promise
Apr 12 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
Jul 13 Javascript
Iphone手机、安卓手机浏览器控制默认缩放大小的方法总结(附代码)
Aug 18 Javascript
js+html5 canvas实现ps钢笔抠图
Apr 28 Javascript
vue 移动端注入骨架屏的配置方法
Jun 25 Javascript
Vue + Element UI图片上传控件使用详解
Aug 20 Javascript
layui的面包屑或者表单不显示的解决方法
Sep 05 Javascript
详解从vue-loader源码分析CSS Scoped的实现
Sep 23 Javascript
IE6图片加载的一个BUG解决方法
Jul 13 #Javascript
IE中createElement需要注意的一个问题
Jul 13 #Javascript
不要在cookie中使用特殊字符的原因分析
Jul 13 #Javascript
初识javascript 文档碎片
Jul 13 #Javascript
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
Jul 13 #Javascript
通过继承IHttpHandle实现JS插件的组织与管理
Jul 13 #Javascript
jQuery.Autocomplete实现自动完成功能(详解)
Jul 13 #Javascript
You might like
PHP 执行系统外部命令 system() exec() passthru()
2009/08/11 PHP
thinkPHP5.0框架环境变量配置方法
2017/03/17 PHP
PHP获取访问设备信息的方法示例
2019/02/20 PHP
PHP中$GLOBALS与global的区别详解
2019/03/21 PHP
javascript函数库-集合框架
2007/04/27 Javascript
Prototype Object对象 学习
2009/07/12 Javascript
javascript 构建一个xmlhttp对象池合理创建和使用xmlhttp对象
2010/01/15 Javascript
javascript tips提示框组件实现代码
2010/11/19 Javascript
js控制滚动条缓慢滚动到顶部实现代码
2013/03/20 Javascript
JS实现静止元素自动移动示例
2014/04/14 Javascript
简介JavaScript中toTimeString()方法的使用
2015/06/12 Javascript
JavaScript对象学习小结
2015/09/02 Javascript
使用RxJS更优雅地进行定时请求详析
2019/06/02 Javascript
layui动态绑定事件的方法
2019/09/20 Javascript
解决antd 表单设置默认值initialValue后验证失效的问题
2020/11/02 Javascript
Python的Django框架中的数据过滤功能
2015/07/17 Python
python3操作微信itchat实现发送图片
2018/02/24 Python
python中plot实现即时数据动态显示方法
2018/06/22 Python
解决Shell执行python文件,传参空格引起的问题
2018/10/30 Python
Python 支付整合开发包的实现
2019/01/23 Python
python 定时任务去检测服务器端口是否通的实例
2019/01/26 Python
Python datetime和unix时间戳之间相互转换的讲解
2019/04/01 Python
python实现Dijkstra算法的最短路径问题
2019/06/21 Python
python 画函数曲线示例
2019/12/04 Python
python mysql中in参数化说明
2020/06/05 Python
大学生自我鉴定评语
2014/01/27 职场文书
水毁工程实施方案
2014/04/01 职场文书
2014预备党员党课学习心得范文
2014/07/08 职场文书
校园广播稿精选
2014/10/01 职场文书
认错检讨书
2014/10/02 职场文书
物业接待员岗位职责
2015/04/15 职场文书
大学生违纪检讨书范文
2015/05/07 职场文书
2016年万圣节家长开放日活动总结
2016/04/05 职场文书
适合毕业生创业的项目怎么找?
2019/08/08 职场文书
死磕 java同步系列之synchronized解析
2021/06/28 Java/Android
使用Nginx+Tomcat实现负载均衡的全过程
2022/05/30 Servers