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 相关文章推荐
JavaScript 学习笔记(四)
Dec 31 Javascript
yepnope.js 异步加载资源文件
Sep 08 Javascript
jquery利用event.which方法获取键盘输入值的代码
Oct 09 Javascript
jQuery中的val()示例应用
Feb 26 Javascript
javascript实现给定半径求出圆的面积
Jun 26 Javascript
jQuery选择器及jquery案例详解(必看)
May 20 Javascript
浅谈jQuery before和insertBefore的区别
Dec 04 Javascript
python爬取安居客二手房网站数据(实例讲解)
Oct 19 Javascript
JS中Map和ForEach的区别
Feb 05 Javascript
超简单的微信小程序轮播图
Nov 22 Javascript
prettier自动格式化去换行的实现代码
Aug 25 Javascript
Vue3 Composition API的使用简介
Mar 29 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
PHP管理依赖(dependency)关系工具 Composer 安装与使用
2014/08/18 PHP
phpstudy默认不支持64位php的解决方法
2017/02/20 PHP
javascript add event remove event
2008/04/07 Javascript
js opener的使用详解
2014/01/11 Javascript
jQuery对html元素的取值与赋值实例详解
2015/12/18 Javascript
拥Bootstrap入怀——导航栏篇
2016/05/30 Javascript
RequireJS多页面应用实例分析
2016/06/29 Javascript
JavaScript鼠标事件,点击鼠标右键,弹出div的简单实例
2016/08/03 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
EasyUI学习之Combobox下拉列表(1)
2016/12/29 Javascript
JS使用正则截取两个字符串之间的字符串实现方法详解
2017/01/06 Javascript
AngularJS表单提交实例详解
2017/02/18 Javascript
angular.js+node.js实现下载图片处理详解
2017/03/31 Javascript
JS函数节流和防抖之间的区分和实现详解
2019/01/11 Javascript
微信小程序+云开发实现欢迎登录注册
2019/05/24 Javascript
layui 数据表格+分页+搜索+checkbox+缓存选中项数据的方法
2019/09/21 Javascript
手把手教你实现 Promise的使用方法
2020/09/02 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
2020/11/13 Javascript
[15:20]DOTA2亚洲邀请赛总决赛开幕式表演:羽泉献唱
2017/04/05 DOTA
详细解读Python中解析XML数据的方法
2015/10/15 Python
python numpy格式化打印的实例
2018/05/14 Python
Python socket模块方法实现详解
2019/11/05 Python
django框架基于queryset和双下划线的跨表查询操作详解
2019/12/11 Python
Python读写csv文件流程及异常解决
2020/10/20 Python
python爬虫 requests-html的使用
2020/11/30 Python
松本清官方海外旗舰店:日本最大的药妆连锁店
2017/11/21 全球购物
澳大利亚自然和有机的健康美容产品一站式商店:Ziani Beauty
2017/12/28 全球购物
英国时尚配饰、珠宝和服装网站:KJ Beckett
2020/01/23 全球购物
巴西购物网站:Onofre Agora
2020/06/08 全球购物
广州喜创信息技术有限公司JAVA软件工程师笔试题
2012/10/17 面试题
敏捷开发的主要原则都有哪些
2015/04/26 面试题
什么是组件架构
2016/05/15 面试题
竞选卫生委员演讲稿
2014/04/28 职场文书
办理房产证委托书
2014/09/18 职场文书
范文之农村基层党建工作报告
2019/10/24 职场文书
零基础学java之循环语句的使用
2022/04/10 Java/Android