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 相关文章推荐
不错的新闻标题颜色效果
Dec 10 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
Dec 05 Javascript
javascript日期对象格式化为字符串的实现方法
Jan 14 Javascript
利用Javascript仿Excel的数据透视分析功能
Sep 07 Javascript
详谈表单重复提交的三种情况及解决方法
Aug 16 Javascript
详解vue-router 初始化时做了什么
Jun 11 Javascript
vue forEach循环数组拿到自己想要的数据方法
Sep 21 Javascript
JavaScript中AOP的实现与应用
May 06 Javascript
CountUp.js数字滚动插件使用方法详解
Oct 17 Javascript
解决vue的过渡动画无法正常实现问题
Oct 31 Javascript
浅析Vue 防抖与节流的使用
Nov 14 Javascript
vue+springboot实现登录验证码
May 27 Vue.js
基于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
BBS(php & mysql)完整版(四)
2006/10/09 PHP
ubuntu下编译安装xcache for php5.3 的具体操作步骤
2013/06/18 PHP
PHP 关于访问控制的和运算符优先级介绍
2013/07/08 PHP
php页码形式分页函数支持静态化地址及ajax分页
2014/03/28 PHP
php的慢速日志引起的Mysql错误问题分析
2014/05/13 PHP
PHP中使用gettext解决国际化问题的例子(i18n)
2014/06/13 PHP
Laravel框架中缓存的使用方法分析
2019/09/06 PHP
半角全角相互转换的js函数
2009/10/16 Javascript
javascript针对DOM的应用实例(一)
2012/04/15 Javascript
node.js中的fs.chown方法使用说明
2014/12/16 Javascript
使用console进行性能测试
2015/04/27 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
2016/04/12 Javascript
详解jQuery简单的表格应用
2016/12/16 Javascript
Ext JS 实现建议词模糊动态搜索功能
2017/05/13 Javascript
使用Angular自定义字段校验指令的方法示例
2019/02/01 Javascript
JS this关键字在ajax中使用出现问题解决方案
2020/07/17 Javascript
JS实现多功能计算器
2020/10/28 Javascript
[44:39]2014 DOTA2国际邀请赛中国区预选赛 NE VS CNB
2014/05/21 DOTA
[01:09:19]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第二场 2月28日
2021/03/11 DOTA
python实现根据月份和日期得到星座的方法
2015/03/27 Python
使用Python的判断语句模拟三目运算
2015/04/24 Python
python实现同时给多个变量赋值的方法
2015/04/30 Python
python利用有道翻译实现"语言翻译器"的功能实例
2017/11/14 Python
Python操作MySQL数据库的三种方法总结
2018/01/30 Python
Linux-ubuntu16.04 Python3.5配置OpenCV3.2的方法
2018/04/02 Python
Python应用库大全总结
2018/05/30 Python
python得到单词模式的示例
2018/10/15 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
2020/05/27 Python
python基于opencv实现人脸识别
2021/01/04 Python
介绍一下linux的文件权限
2012/02/15 面试题
学习三严三实心得体会
2014/10/13 职场文书
财务总监岗位职责范本
2015/04/03 职场文书
少先队入队仪式主持词
2015/07/04 职场文书
养成教育工作总结
2015/08/13 职场文书
《好妈妈胜过好老师》:每个孩子的优秀都是有源头的
2020/01/03 职场文书
JavaScript高级程序设计之变量与作用域
2021/11/17 Javascript