news 2026/4/3 4:05:10

Vue—— Vue3 缓存策略与内存管理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue—— Vue3 缓存策略与内存管理

背景问题:
需要有效的缓存策略来提升性能。

方案思考:
实现多层次的缓存策略。

具体实现:
缓存管理器:

// utils/cache-manager.js// 缓存管理器exportclassCacheManager{constructor(options={}){this.storage=options.storage||localStoragethis.maxSize=options.maxSize||100// 最大缓存数量this.defaultExpireTime=options.defaultExpireTime||30*60*1000// 默认30分钟过期this.cache=newMap()}// 设置缓存set(key,value,expireTime=this.defaultExpireTime){constitem={value,timestamp:Date.now(),expireTime}// 检查缓存大小,如果超过限制则清理最旧的项if(this.cache.size>=this.maxSize){constoldestKey=this.cache.keys().next().valuethis.cache.delete(oldestKey)}this.cache.set(key,item)// 同时存储到本地存储try{this.storage.setItem(`cache_${key}`,JSON.stringify(item))}catch(e){console.warn('缓存存储失败:',e)}}// 获取缓存get(key){// 先从内存缓存获取letitem=this.cache.get(key)// 如果内存中没有,尝试从本地存储获取if(!item){try{conststored=this.storage.getItem(`cache_${key}`)if(stored){item=JSON.parse(stored)// 验证是否过期if(this.isExpired(item)){this.remove(key)returnnull}// 重新加入内存缓存this.cache.set(key,item)}}catch(e){console.warn('缓存读取失败:',e)returnnull}}// 检查是否过期if(item&&this.isExpired(item)){this.remove(key)returnnull}returnitem?item.value:null}// 检查是否过期isExpired(item){returnDate.now()-item.timestamp>item.expireTime}// 移除缓存remove(key){this.cache.delete(key)this.storage.removeItem(`cache_${key}`)}// 清空所有缓存clear(){this.cache.clear()// 清除所有以 cache_ 开头的存储项for(leti=0;i<this.storage.length;i++){constkey=this.storage.key(i)if(key&&key.startsWith('cache_')){this.storage.removeItem(key)i--// 修正索引}}}// 获取缓存统计信息getStats(){constvalidItems=[]constexpiredItems=[]for(const[key,item]ofthis.cache){if(this.isExpired(item)){expiredItems.push(key)}else{validItems.push(key)}}return{total:this.cache.size,valid:validItems.length,expired:expiredItems.length,keys:validItems}}// 清理过期缓存cleanup(){for(const[key,item]ofthis.cache){if(this.isExpired(item)){this.remove(key)}}}}// 创建全局缓存实例exportconstcacheManager=newCacheManager()

响应式缓存组合函数:

// composables/useCachedData.jsimport{ref,computed,onMounted}from'vue'import{cacheManager}from'@/utils/cache-manager'exportfunctionuseCachedData(cacheKey,fetchDataFn,options={}){const{expireTime=30*60*1000,// 30分钟immediate=true,enableCache=true}=optionsconstdata=ref(null)constloading=ref(false)consterror=ref(null)// 从缓存获取数据constloadData=async()=>{if(enableCache){// 尝试从缓存获取constcachedData=cacheManager.get(cacheKey)if(cachedData){data.value=cachedDatareturn}}loading.value=trueerror.value=nulltry{constresult=awaitfetchDataFn()data.value=result// 存入缓存if(enableCache){cacheManager.set(cacheKey,result,expireTime)}}catch(err){error.value=err console.error('数据加载失败:',err)}finally{loading.value=false}}// 刷新数据(不使用缓存)constrefresh=async()=>{// 先清除缓存cacheManager.remove(cacheKey)awaitloadData()}// 更新缓存constupdateCache=(newData)=>{data.value=newDataif(enableCache){cacheManager.set(cacheKey,newData,expireTime)}}// 删除缓存constinvalidateCache=()=>{cacheManager.remove(cacheKey)}if(immediate){onMounted(loadData)}return{data:computed(()=>data.value),loading:computed(()=>loading.value),error:computed(()=>error.value),loadData,refresh,updateCache,invalidateCache}}

内存泄漏检测:

// utils/memory-monitor.js// 内存监控工具exportclassMemoryMonitor{constructor(){this.observer=nullthis.observedElements=newWeakMap()}// 监控DOM元素泄漏observeElement(element,owner){if(!this.observedElements.has(element)){this.observedElements.set(element,owner)}}// 检测内存泄漏detectLeaks(){if(typeofwindow!=='undefined'&&window.performance&&window.performance.memory){constmemory=window.performance.memoryreturn{used:memory.usedJSHeapSize,total:memory.totalJSHeapSize,limit:memory.jsHeapSizeLimit,usage:(memory.usedJSHeapSize/memory.totalJSHeapSize*100).toFixed(2)+'%'}}returnnull}// 清理未使用的引用cleanup(){// 在开发环境中打印潜在的内存泄漏if(process.env.NODE_ENV==='development'){console.log('执行内存清理...')}}// 监控组件实例monitorComponent(componentInstance,name){// 记录组件实例以便后续检查if(!this.componentInstances){this.componentInstances=newWeakSet()}this.componentInstances.add(componentInstance)}}exportconstmemoryMonitor=newMemoryMonitor()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/16 0:44:49

基于STM32的CANFD通信实战案例:从零实现高速数据传输

从零构建高速CAN FD通信&#xff1a;基于STM32的实战全解析当总线“堵车”时&#xff0c;我们该怎么办&#xff1f;在开发一款新能源汽车的电池管理系统&#xff08;BMS&#xff09;原型时&#xff0c;团队曾遇到这样一个棘手问题&#xff1a;每10毫秒需要上报一次24节电芯的电…

作者头像 李华
网站建设 2026/3/27 3:08:51

交通仿真软件:VISSIM_(3).VISSIM用户界面与基本操作

VISSIM用户界面与基本操作 1. 用户界面介绍 VISSIM 是一款功能强大的交通仿真软件&#xff0c;其用户界面设计直观且易于操作。了解用户界面的各个组成部分是进行有效仿真的第一步。以下是VISSIM用户界面的主要组件及其功能&#xff1a;菜单栏&#xff1a;位于软件顶部&#xf…

作者头像 李华
网站建设 2026/3/30 10:49:44

Kronos金融大模型:重新定义量化投资的技术边界

Kronos金融大模型&#xff1a;重新定义量化投资的技术边界 【免费下载链接】Kronos Kronos: A Foundation Model for the Language of Financial Markets 项目地址: https://gitcode.com/GitHub_Trending/kronos14/Kronos 当传统量化策略遭遇数据洪流&#xff0c;当高频…

作者头像 李华
网站建设 2026/3/31 15:30:04

opencode支持WebAssembly吗?前沿技术适配路线图展望

opencode支持WebAssembly吗&#xff1f;前沿技术适配路线图展望 1. 技术背景与核心问题 随着边缘计算、轻量化部署和跨平台运行需求的不断增长&#xff0c;WebAssembly&#xff08;Wasm&#xff09;已成为现代软件架构中不可忽视的关键技术。它允许高性能、沙箱化的代码在浏览…

作者头像 李华
网站建设 2026/3/5 3:32:38

FRCRN语音降噪模型测试:不同语言环境表现

FRCRN语音降噪模型测试&#xff1a;不同语言环境表现 1. 技术背景与测试目标 随着智能语音设备在多语言场景中的广泛应用&#xff0c;语音前端处理技术的重要性日益凸显。其中&#xff0c;语音降噪作为提升语音识别、语音通信质量的关键环节&#xff0c;直接影响用户体验。FR…

作者头像 李华
网站建设 2026/3/31 11:33:05

复杂文档解析新选择|基于PaddleOCR-VL-WEB实现高精度多语言识别

复杂文档解析新选择&#xff5c;基于PaddleOCR-VL-WEB实现高精度多语言识别 1. 写在前面 随着企业数字化转型的深入&#xff0c;非结构化文档的自动化处理已成为提升效率的关键环节。尤其是面对排版复杂、多语言混杂、包含表格与公式的PDF文档时&#xff0c;传统OCR工具往往力…

作者头像 李华