前言
去年就已经开发并应用大半年了,但是最近又被提出优化项,故趁此机会完整记录下
分析
过期时间的比较可以在获取时,当过期时直接删除
可以借助Reflect.defineProperty设置get为每一次访问做拦截,并在此做过期校验
为了保证数据的"干净",将过期时间单独保存起来,并去监听浏览器的刷新事件,在发生刷新行为后,存储过期时间,并在下次重新实例化时从localStorage中获取,并根据过期时间重新校验一次,这样配合每次校验的能力,就不需要设置定时器了
实现
初始化
我个人是倾向于全局统一的,所以一开始是做成了单例模式,但是后续使用过程中发现都不这么用,故去除了
初始化主要就是生产一个根命名作为store,并注册浏览器的beforeunload事件将过期信息保存后读取到该信息做一遍过期校验以省略定时器的使用
设置(可批量)
这里主要就是做一些参数处理,比如对批量时接收对象,非批量接收对象合并成数组,根据是否提供name属性决定设置的值是在命名下的对象下还是直接挂在命名下
def方法则是为过期时间设置校验拦截
clear、getItem、removeItem
均要支持仅清空当前命名空间下的值或清空所有
过期时间也要支持单独设置
使用
存储效果
写在最后
一开始在未摒弃定时器的情况下,我的思路是监听浏览器刷新,本地存储已经过的时间,当刷新后计算差值时间后重新设置定时器,然后通过如下伪代码获取所有key后遍历由redis控制的部分并校验过期