cache-lib
Version:
cache.js 是一个轻量级的 JS 库,对 `localStorage`、`sessionStorage`进行了扩展,增加了序列化方法和过期时间。可以直接存取JSON对象、设置过期时间。
1 lines • 6.32 kB
JavaScript
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.Cache=t()}(this,function(){"use strict";var c={debug:!1,storage:"localStorage"},e={};function o(e,t,r){var c,o,s=(c=t,o=parseFloat(c),isNaN(o)?c:o);switch(i(e)){case"y":r.setFullYear(r.getFullYear()+s);break;case"M":r.setMonth(r.getMonth()+s);break;case"w":r.setDate(r.getDate()+7*s);break;case"d":r.setDate(r.getDate()+s);break;case"h":r.setHours(r.getHours()+s);break;case"m":r.setMinutes(r.getMinutes()+s);break;case"s":r.setSeconds(r.getSeconds()+s);break;default:r.setDate(r.getDate()+s)}return r}function s(e,t,r){if(c.debug)switch(e){case"set":console.log("%c cache:%cSET "+t+" %c"+r,"color:green","color:green;font-weight:bold","");break;case"get":console.log("%c cache:%cGET "+t+" %c"+r,"color:blue","color:blue;font-weight:bold","");break;case"remove":console.log("%c cache:%cREMOVE "+t+" %c"+r,"color:#93135F","color:#93135F;font-weight:bold","");break;case"clear":console.log("%c cache:%cCLEAR "+t+" %c"+r,"color:#56CB96","color:#56CB96;font-weight:bold","");break;case"update":console.log("%c cache:%cUPDATE "+t+" %c"+r,"color:#199DCE","color:#199DCE;font-weight:bold","");break;case"keys":console.log("%c cache:%cKEYS "+t+" %c"+r,"color:#D38DB3","color:#D38DB3;font-weight:bold","")}}e.debug={enable:function(){c.debug=!0},disabled:function(){c.debug=!1},state:function(){return c.debug}},e.set=function(){if(!this.canIUse)return!1;var e=arguments;try{switch(e.length){case 2:var t=l(this.storage.getItem(i(e[0])));t&&"object"==typeof t&&""!=t.Expires?this.storage.setItem(i(e[0]),i({Content:e[1],Expires:t.Expires})):this.storage.setItem(i(e[0]),i({Content:e[1],Expires:""}));var r=""==(t=JSON.parse(this.storage.getItem(i(e[0])))).Expires?"":new Date(t.Expires);s("set","success",i(e[0])+":"+i(e[1])+" "+r);break;case 3:a(e[2])&&n(e[2],"type")&&n(e[2],"delay")?(this.storage.setItem(i(e[0]),i({Content:e[1],Expires:o(e[2].type,e[2].delay,new Date)})),s("set","success",i(e[0])+":"+i(e[1])+" "+o(e[2].type,e[2].delay,new Date))):console.error('%c cache:%cSET error %c过期时间设置格式必须是%c {"type":时间类型<String>,"delay":延迟时间<Number>} %c!',"","font-weight:bold","","font-style: italic","");break;default:console.error("%c cache:%cSET error %c参数应为%c (键<String>, 值<Any>, [过期时间<Obj>]) %c!","","font-weight:bold","","font-style: italic","")}}catch(e){}},e.get=function(){if(!this.canIUse)return!1;var e=arguments;try{switch(e.length){case 1:var t=l(this.storage.getItem(i(e[0])));if(!t)return void s("get","error",i(e[0])+" 此 Key 不存在!");if("object"==typeof t){var r=""==t.Expires?"":new Date(t.Expires);return""!==t.Expires&&new Date(t.Expires)<new Date?(this.storage.removeItem(i(e[0])),s("get","success",i(e[0])+" 过期已清除!")):s("get","success",i(e[0])+":"+i(t.Content)+" "+r),t.Content}return s("get","success",i(e[0])+":"+i(t)),t;default:console.error("%c cache:%cGET error %c参数应为%c (键<String>) %c!","","font-weight:bold","","font-style: italic","")}}catch(e){}},e.remove=function(){if(!this.canIUse)return!1;var e=arguments,t="";try{var r=l(this.storage.getItem(i(e[0])));if(!r)return void s("remove","error",i(e[0])+" 此 Key 不存在!");"object"==typeof r&&(t=""==r.Expires?"":new Date(r.Expires)),s("remove","success",i(e[0])+":"+i(r.Content)+" "+t),this.storage.removeItem(i(e[0]))}catch(e){}},e.clear=function(){if(!this.canIUse)return!1;var e=arguments,r=this;try{if("exp"==e[0]){var c=this.keys("exp");c.forEach(function(e,t){return r.storage.removeItem(e),s("clear","success",i(c)),c})}else this.storage.clear(),s("clear","success","清除所有数据成功!")}catch(e){}},e.update=function(){if(!this.canIUse)return!1;var e=arguments;try{var t=l(this.storage.getItem(i(e[0])));if(!t)return void s("update","error",i(e[0])+" 此 Key 不存在!");switch(e.length){case 2:a(e[1])&&n(e[1],"type")&&n(e[1],"delay")?(this.storage.setItem(i(e[0]),i({Content:"object"==typeof t&&n(t,"Content")?t.Content:t,Expires:o(e[1].type,e[1].delay,new Date)})),s("update","success",i(e[0])+":"+i(this.storage.getItem(i(e[0])))+" "+o(e[1].type,e[1].delay,new Date))):console.error('%c cache:%cUPDATE error %c过期时间设置格式必须是%c {"type":时间类型<String>,"delay":延迟时间<Number>} %c!',"","font-weight:bold","","font-style: italic","");break;case 3:a(e[2])&&n(e[2],"type")&&n(e[2],"delay")?(this.storage.setItem(i(e[0]),i({Content:e[1],Expires:o(e[2].type,e[2].delay,new Date)})),s("update","success",i(e[0])+":"+i(e[1])+" "+o(e[2].type,e[2].delay,new Date))):console.error('%c cache:%cUPDATE error %c过期时间设置格式必须是%c {"type":时间类型<String>,"delay":延迟时间<Number>} %c!',"","font-weight:bold","","font-style: italic","");break;default:console.error("%c cache:%cUPDATE error %c参数应为%c (键<String>, [值<Any>], 过期时间<Obj>) %c!","","font-weight:bold","","font-style: italic","")}}catch(e){}},e.keys=function(){if(!this.canIUse)return!1;var e=arguments;try{var t=[];for(var r in this.storage){if("length"==r)break;if("exp"==e[0]){var c=l(this.storage.getItem(r));if(!a(c)||!n(c,"Expires"))continue;if(""==c.Expires)continue;if(new Date(c.Expires)>=new Date)continue}t.push(r),s("keys","success",i(t))}return t}catch(e){}};var r=Object.prototype.hasOwnProperty;function n(e,t){return r.call(e,t)}function a(e){return null!==e&&"object"==typeof e}function i(e){return null==e?"":"object"==typeof e?JSON.stringify(e):String(e)}function l(e){return function(e){if("string"==typeof e)try{return!!a(JSON.parse(e))}catch(e){return!1}}(e)?JSON.parse(e):e}function t(){var e=arguments;switch(e.length){case 0:break;case 1:"localStorage"==e[0]||"sessionStorage"==e[0]?c.storage=e[0]:console.warn('cache:%cWARN %c配置参数必须是"localStorage"或"sessionStorage"!',"font-weight:bold","");break;default:console.warn("cache:%cWARN %c配置参数必须是字符串!","font-weight:bold","")}var t=function(e){try{return"string"==typeof e&&window[e]instanceof Storage?window[e]:e}catch(e){}}(c.storage),r=function(e){var t=!1;if(e&&e.setItem){t=!0;var r="_"+Math.round(1e7*Math.random());try{e.setItem(r,r),e.removeItem(r)}catch(e){t=!1}}return t}(t);this.canIUse=function(){return r},this.storage=t}return t.prototype=e,t});