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 相关文章推荐
关于viewport,Ext.panel和Ext.form.panel的关系
May 07 Javascript
javascript 学习笔记(八)javascript对象
Apr 12 Javascript
使用 JScript 创建 .exe 或 .dll 文件的方法
Jul 13 Javascript
JavaScript实现的图像模糊算法代码分享
Apr 22 Javascript
node+experss实现爬取电影天堂爬虫
Nov 20 Javascript
利用js+css+html实现固定table的列头不动
Dec 08 Javascript
原生JS实现幻灯片
Feb 22 Javascript
详解Vue 如何监听Array的变化
Jun 06 Javascript
vue 解决addRoutes多次添加路由重复的操作
Aug 04 Javascript
wepy--用vantUI 实现上弹列表并选择相应的值操作
Nov 03 Javascript
React中使用Vditor自定义图片详解
Dec 25 Javascript
JavaScript 防盗链的原理以及破解方法
Dec 29 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 smarty模版引擎中的缓存应用
2009/12/02 PHP
利用php获取服务器时间的实现代码
2013/06/07 PHP
jQuery+PHP实现图片上传并提交功能
2020/07/27 PHP
Tips 带三角可关闭的文字提示
2010/10/06 Javascript
使用jQuery操作Cookies的实现代码
2011/10/09 Javascript
js获取浏览器的可视区域尺寸的实现代码
2011/11/30 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
JS实现根据出生年月计算年龄
2014/01/10 Javascript
jQuery实现数秒后自动提交form的方法
2015/03/05 Javascript
JavaScript添加随滚动条滚动窗体的方法
2016/02/23 Javascript
很实用的js选项卡切换效果
2016/08/12 Javascript
微信小程序 富文本转文本实例详解
2016/10/24 Javascript
javascript常用的设计模式
2017/02/09 Javascript
vue双向数据绑定知识点总结
2018/04/18 Javascript
jquery-ui 进度条功能示例【测试可用】
2019/07/25 jQuery
layui中select,radio设置不生效的解决方法
2019/09/05 Javascript
微信小程序实现天气预报功能(附源码)
2020/12/10 Javascript
[55:26]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第一场 2月23日
2021/03/11 DOTA
学习python处理python编码问题
2011/03/13 Python
Python读写配置文件的方法
2015/06/03 Python
Python中的heapq模块源码详析
2019/01/08 Python
PyQT5 QTableView显示绑定数据的实例详解
2019/06/25 Python
Python3.7 读取音频根据文件名生成脚本的代码
2020/04/07 Python
Python内置函数locals和globals对比
2020/04/28 Python
python实点云分割k-means(sklearn)详解
2020/05/28 Python
浅谈keras使用中val_acc和acc值不同步的思考
2020/06/18 Python
CSS3中动画属性transform、transition和animation属性的区别
2016/09/25 HTML / CSS
Brasty波兰:香水、化妆品、手表网上商店
2019/04/15 全球购物
PHP笔试题
2012/02/22 面试题
幼儿园教师备课制度
2014/01/12 职场文书
酒店总经理岗位职责
2014/03/17 职场文书
奥巴马竞选演讲稿
2014/05/15 职场文书
银行主办会计岗位职责
2014/08/13 职场文书
婚宴新娘致辞
2015/07/28 职场文书
用Python进行栅格数据的分区统计和批量提取
2021/05/27 Python
Springboot如何同时装配两个相同类型数据库
2021/11/17 Java/Android