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 相关文章推荐
Javascript模块化编程详解
Dec 01 Javascript
angularJS 中input示例分享
Feb 09 Javascript
RequireJS简易绘图程序开发
Oct 28 Javascript
jQuery Validate 相关参数及常用的自定义验证规则
Mar 06 Javascript
jQuery实现选中行变色效果(实例讲解)
Jul 06 jQuery
详解ES6系列之私有变量的实现
Nov 21 Javascript
koa router 多文件引入的方法示例
May 22 Javascript
JsonProperty 的使用方法详解
Oct 11 Javascript
vue实现一个6个输入框的验证码输入组件功能的实例代码
Jun 29 Javascript
如何在JS文件中获取Vue组件
Sep 16 Javascript
js实现圆形菜单选择器
Dec 03 Javascript
ECharts transform数据转换和dataZoom在项目中使用
Dec 24 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
SONY SRF-M100的电路分析
2021/03/02 无线电
php面向对象全攻略 (四)构造方法与析构方法
2009/09/30 PHP
php Xdebug的安装与使用详解
2013/06/20 PHP
手把手教你打印出PDF(关于fpdf的简单应用)
2013/06/25 PHP
ThinkPHP模板自定义标签使用方法
2014/06/26 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
2014/11/18 PHP
CentOS7编译安装php7.1的教程详解
2019/04/18 PHP
laravel 获取当前url的别名方法
2019/10/11 PHP
JQuery SELECT单选模拟jQuery.select.js
2009/11/12 Javascript
20个非常棒的Jquery实用工具 国外文章
2010/01/01 Javascript
JavaScript生成带有缩进的表格代码
2016/06/15 Javascript
jQuery旋转插件jqueryrotate用法详解
2016/10/13 Javascript
详解浏览器渲染页面过程
2017/02/09 Javascript
angular directive的简单使用总结
2017/05/24 Javascript
关于JS与jQuery中的文档加载问题
2017/08/22 jQuery
解读vue生成的文件目录结构及说明
2017/11/27 Javascript
微信小程序实时聊天WebSocket
2018/07/05 Javascript
使用vue实现各类弹出框组件
2019/07/03 Javascript
Vue实现input宽度随文字长度自适应操作
2020/07/29 Javascript
基于javascript的无缝滚动动画实现2
2020/08/07 Javascript
Openlayers显示地理位置坐标的方法
2020/09/28 Javascript
[42:24]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第三场 11.27
2020/12/01 DOTA
pycharm 使用心得(六)进行简单的数据库管理
2014/06/06 Python
Python语言的面相对象编程方式初步学习
2016/03/12 Python
python实现Dijkstra算法的最短路径问题
2019/06/21 Python
html5教程画矩形代码分享
2013/12/04 HTML / CSS
波兰运动鞋网上商店:e-Sporting
2018/02/16 全球购物
美国学校用品、教室和教学商店:Discount School Supply
2018/04/04 全球购物
学生安全责任书范本
2014/07/24 职场文书
司法局群众路线教育实践活动整改措施
2014/09/17 职场文书
离婚协议书格式
2014/11/21 职场文书
小学三八妇女节活动总结
2015/02/06 职场文书
教师理论学习心得体会
2016/01/21 职场文书
2016年社区党支部公开承诺书
2016/03/25 职场文书
关于CentOS 8 搭建MongoDB4.4分片集群的问题
2021/10/24 MongoDB
Java数据结构之堆(优先队列)
2022/05/20 Java/Android