news 2026/4/18 13:55:40

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/4/18 6:30:03

交通仿真软件:TransModeler_(18).交通仿真在环境保护中的应用

交通仿真在环境保护中的应用 在现代社会中&#xff0c;交通系统的发展对环境产生了显著的影响。交通仿真软件在环境保护中的应用已经成为一个重要的研究领域&#xff0c;通过仿真技术可以评估交通系统对环境的影响&#xff0c;进而采取有效的措施减少环境污染。本节将详细介绍如…

作者头像 李华
网站建设 2026/4/18 6:27:26

交通仿真软件:TransModeler_(19).交通仿真在交通安全中的应用

交通仿真在交通安全中的应用 交通仿真是评估和改进交通安全的重要工具。通过仿真&#xff0c;交通工程师和研究人员可以模拟不同交通条件下的驾驶行为、交通流量和事故风险&#xff0c;从而为交通安全设计提供科学依据。本节将详细介绍交通仿真在交通安全中的应用原理和具体操作…

作者头像 李华
网站建设 2026/4/18 8:15:21

FunASR实战:播客内容分析与标签系统

FunASR实战&#xff1a;播客内容分析与标签系统 1. 引言 1.1 业务场景描述 随着音频内容消费的持续增长&#xff0c;播客已成为知识传播、品牌营销和用户互动的重要载体。然而&#xff0c;大量非结构化的音频数据难以被有效检索、归类和再利用。如何从海量播客中提取有价值的…

作者头像 李华
网站建设 2026/4/17 15:40:59

如何快速掌握OpenCode VS Code扩展:AI编程助手的完整使用指南

如何快速掌握OpenCode VS Code扩展&#xff1a;AI编程助手的完整使用指南 【免费下载链接】opencode 一个专为终端打造的开源AI编程助手&#xff0c;模型灵活可选&#xff0c;可远程驱动。 项目地址: https://gitcode.com/GitHub_Trending/openc/opencode OpenCode VS C…

作者头像 李华
网站建设 2026/4/18 5:42:13

DeepSeek-OCR-WEBUI详解|高性能OCR文本识别部署全流程

DeepSeek-OCR-WEBUI详解&#xff5c;高性能OCR文本识别部署全流程 1. 背景与技术价值 随着数字化转型的加速&#xff0c;企业对非结构化文档的自动化处理需求日益增长。在票据识别、证件录入、档案电子化等场景中&#xff0c;光学字符识别&#xff08;OCR&#xff09;技术成为…

作者头像 李华