Vuex和前端缓存的整合策略详解


Posted in Javascript onMay 09, 2017

如何存放或更新缓存?

缓存数据来源是预知的,我们可以预先定义哪些 mutation 是缓存相关的。

我们期望这个过程更自然一点,通过某种变化自动映射,使以后不管缓存类别增加还是减少都能修改极少的代码来应对变化。

Vuex的插件可以拦截 mutations,借助这个机制,我们可以制定一种策略化的规则。

可以规定,所有需要更新缓存的 mutationType 都要符合这种格式:module-type-cacheKey,非缓存的 mutationType 格式为 module-type。

那么就可以拦截 mutation,去做我们想做的事了:

store.subscribe(({ type, payload }) => {
 const cacheKey = type.split('-')[2]
 if (cacheKey) {
  Cache.save(cacheKey, payload)
 }
})

如何从缓存取数据避免请求?

只需要在缓存相关的 action 中加入缓存判断。

action
fetchData({commit}) {
 const cacheData = Cache.get(cacheKey)
 if(!cacheData) {
  Api.getData().then(data => {
   commit(mutationType, data)
  })
 } else {
  commit(mutationType, cacheData)
 }
}

设计优化

以上的确已经足够完成缓存 读取 --> 更新 的工作了。但试想一下将来某个其他数据类别要做缓存,我们就要把上面的代码格式再搬一遍。

即:把新的需要缓存的数据类别对应的 mutationType 加 cacheKey 后缀,把获取数据的 action 中加缓存判断。

虽然实际编码中也没有多大的工作量,但感觉还不是最好的开发体验。

action优化

action 中的痛点是:每次都需要重复写缓存判断。可以把这个判断过程拿出来放到一个大家都能访问到的公共的地方,且最好是与 Vuex 契合的。

Vuex 支持 action 相互调用,我们可以设置一个单独的 action 用来提交。

commitAction({ commit }, mutationType, getData) {
 const cacheKey = mutationType.split('-')[2]
 const cacheData = Cache.get(cacheKey || '')
 if(!cacheData) {
  getData().then(data => {
   commit(mutationType, data)
  })
 } else {
  commit(mutationType, cacheData)
 }
},
fetchData({ dispatch }) {
 dispatch('commitAction', mutationType, Api.getData)
}

不管是否需要缓存最终都走同一个 action 去提交,由这个 action 去做决策。

mutation优化

mutation 的痛点在于:加后缀啊!加后缀啊!!

如果一个数据的相关逻辑复杂,可能对应很多个 mutationType,每个都需要:加后缀!

要是代码能自动识别需要走缓存的 mutationType 就完美了!

mutationType 默认的格式为 module-type,假如业务中一个 module 对应一个数据类别,我们就可以基于 module 作缓存识别。

cacheConfig.js
export default {
 module1: 'key1',
 module2: 'key2',
 //...
}
action
commitAction({ commit }, mutationType, getData) {
 const module = mutationType.split('-')[0]
 const cacheKey = CacheConfig[module] || ''
 const cacheData = Cache.get(cacheKey)
 if(!cacheData) {
  getData().then(data => {
   commit(mutationType, data)
  })
 } else {
  commit(mutationType, cacheData)
 }
},
fetchData({ dispatch }) {
 dispatch('commitAction', mutationType, Api.getData)
}
interceptor
store.subscribe(({ type, payload }) => {
 const module = type.split('-')[0]
 const cacheKey = CacheConfig[module]
 if (cacheKey) {
  Cache.save(cacheKey, payload)
 }
})

当我们需要新增或减少缓存数据,只需要去 cacheConfig 中增加或减少一项模块配置。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jQuery 学习入门篇附实例代码
Mar 16 Javascript
Node.js的包详细介绍
Jan 14 Javascript
WEB前端开发框架Bootstrap3 VS Foundation5
May 16 Javascript
老生常谈JavaScript数组的用法
Jun 10 Javascript
php main 与 iframe 相互通讯类(js+php同域/跨域)
Sep 14 Javascript
vue父组件向子组件动态传值的两种方法
Nov 11 Javascript
JS 中document.write()的用法和清空的原因浅析
Dec 04 Javascript
javascript用rem来做响应式开发
Jan 13 Javascript
jquery实现Ajax请求的几种常见方式总结
May 28 jQuery
小程序如何获取多个formId实现详解
Sep 20 Javascript
Json实现传值到后台代码实例
Jun 30 Javascript
vue3.0搭配.net core实现文件上传组件
Oct 29 Javascript
基于JS实现限时抢购倒计时间表代码
May 09 #Javascript
js使用i18n实现页面国际化的方法
May 09 #Javascript
Angular中$state.go页面跳转并传递参数的方法
May 09 #Javascript
Vue 2.0中生命周期与钩子函数的一些理解
May 09 #Javascript
JavaScript中splice与slice的区别
May 09 #Javascript
详解node中创建服务进程
May 09 #Javascript
微信小程序 自动登陆PHP源码实例(源码下载)
May 08 #Javascript
You might like
分页详解 从此分页无忧(PHP+mysql)
2007/11/23 PHP
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
2012/03/27 PHP
PHP调用JAVA的WebService简单实例
2014/03/11 PHP
YII模块实现绑定二级域名的方法
2014/07/09 PHP
PHP实现可自定义样式的分页类
2016/03/29 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
2016/11/14 PHP
Jqyery中同等与js中windows.onload的应用
2011/05/10 Javascript
五个jQuery图片画廊插件 推荐
2011/05/12 Javascript
Webkit的跨域安全问题说明
2011/09/13 Javascript
JQuery 操作/获取table具体代码
2013/06/13 Javascript
js实现简单的可切换选项卡效果
2015/04/10 Javascript
原生js制作简单的数字键盘
2015/04/24 Javascript
JS非Alert实现网页右下角“未读信息”效果弹窗
2015/09/26 Javascript
Angularjs 与 bower安装和使用详解
2017/05/11 Javascript
vue 2.0项目中如何引入element-ui详解
2017/09/06 Javascript
JQuery获得内容和属性方法解析
2020/05/30 jQuery
CentOS 8.2服务器上安装最新版Node.js的方法
2020/12/16 Javascript
[01:43]倾听DOTA2英雄之声 魅惑魔女国服配音鉴赏
2013/06/06 DOTA
[48:53]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS VG第一场
2014/05/26 DOTA
在Windows系统上搭建Nginx+Python+MySQL环境的教程
2015/12/25 Python
浅谈Django自定义模板标签template_tags的用处
2017/12/20 Python
对python 各种删除文件失败的处理方式分享
2018/04/24 Python
pd.DataFrame统计各列数值多少的实例
2019/12/05 Python
PyCharm上安装Package的实现(以pandas为例)
2020/09/18 Python
Python如何telnet到网络设备
2021/02/18 Python
python 制作磁力搜索工具
2021/03/04 Python
纯css3实现图片翻牌特效
2015/03/10 HTML / CSS
英语感恩演讲稿
2014/01/14 职场文书
小学生期末评语大全
2014/04/21 职场文书
爱护公物演讲稿
2014/09/09 职场文书
回复函格式及范文
2015/07/14 职场文书
升学宴家长致辞
2015/07/27 职场文书
市语委办2016年第十九届“推普周”活动总结
2016/04/05 职场文书
Nginx部署vue项目和配置代理的问题解析
2021/08/04 Servers
Win11 引入 Windows 365 云操作系统,适应疫情期间混合办公模式:启动时直接登录、模
2022/04/06 数码科技
MutationObserver在页面水印实现起到的作用详解
2022/07/07 Javascript