当前位置: 首页 > news >正文

实现图片本地缓存,减少url重复请求

缓存实现代码

/** * 全能型获取图片缓存 (兼容单个链接与链接数组 + 秒开优化) */ export function getImageStorage(url) { return new Promise((resolve) => { // 1. 如果是数组,通过 map 循环调用自身,并用 Promise.all 等待所有结果 if (Array.isArray(url)) { Promise.all(url.map(item => getImageStorage(item))) .then(results => resolve(results)) .catch(() => resolve(url)); // 异常兜底,返回原数组 return; } // 2. 单个链接处理逻辑 if (!url) { resolve(''); return; } // 智能处理 baseUrl 拼接(防止完整的 http/https 链接被重复拼接) // 注意:请确保你的工具文件里已经定义了 baseUrl,如果 url 已经是完整链接则不拼接 const fullUrl = (url.startsWith('http://') || url.startsWith('https://')) ? url : (typeof baseUrl !== 'undefined' ? baseUrl + url : url); // 提取文件名作为缓存 key(兼容带参数的 OSS 链接) const pathWithoutQuery = fullUrl.split('?')[0]; const fullFileName = pathWithoutQuery.substring(pathWithoutQuery.lastIndexOf('/') + 1); const fileNameWithoutExt = fullFileName.substring(0, fullFileName.lastIndexOf('.')) || fullFileName; const storageKey = "IMG_CACHE_" + fileNameWithoutExt; // 本地文件路径缓存 key const urlCacheKey = "URL_CACHE_" + fileNameWithoutExt; // 网络链接兜底缓存 key // --- 核心秒开逻辑:优先读取本地缓存的下载路径 --- const localUrl = uni.getStorageSync(storageKey); if (localUrl) { uni.setStorageSync(urlCacheKey, fullUrl); // 顺便更新一下网络链接缓存 resolve(localUrl); return; } // --- 核心秒开逻辑:如果没有本地文件,看看有没有缓存的网络链接 --- const cachedUrl = uni.getStorageSync(urlCacheKey); if (cachedUrl) { resolve(cachedUrl); // 立刻返回缓存的链接,让页面先渲染出来(实现秒开) } // 3. 执行下载和持久化缓存逻辑 // #ifndef H5 uni.downloadFile({ url: fullUrl, success: (res) => { if (res.statusCode === 200) { const saveSuccess = (savedFilePath) => { uni.setStorageSync(storageKey, savedFilePath); uni.setStorageSync(urlCacheKey, fullUrl); resolve(savedFilePath); }; const saveFail = () => resolve(fullUrl); // 失败兜底返回原链接 // #ifndef MP-WEIXIN || MP-KUAISHOU uni.saveFile({ tempFilePath: res.tempFilePath, success: (r) => saveSuccess(r.savedFilePath), fail: saveFail }); // #endif // #ifdef MP-WEIXIN wx.getFileSystemManager().saveFile({ tempFilePath: res.tempFilePath, success: (r) => saveSuccess(r.savedFilePath), fail: saveFail }); // #endif // #ifdef MP-KUAISHOU ks.saveFile({ tempFilePath: res.tempFilePath, success: (r) => saveSuccess(r.savedFilePath), fail: saveFail }); // #endif } else { resolve(fullUrl); } }, fail: () => resolve(fullUrl), }) // #endif // #ifdef H5 // H5端 fetchBlobDataAsBase64 逻辑(需确保你文件里有这个辅助函数) fetchBlobDataAsBase64(fullUrl) .then(base64Data => { const [header, data] = base64Data.split(','); const mimeType = header.match(/:(.*?);/)[1]; const base64 = `data:${mimeType};base64,${data}`; uni.setStorageSync(storageKey, base64); uni.setStorageSync(urlCacheKey, fullUrl); resolve(base64); }) .catch(() => resolve(fullUrl)) // #endif }); } // H5端辅助函数 function fetchBlobDataAsBase64(blobUrl) { return new Promise((resolve, reject) => { fetch(blobUrl) .then(response => response.blob()) .then(blob => { const reader = new FileReader(); reader.onloadend = () => resolve(reader.result); reader.onerror = () => reject(new Error('无法读取文件')); reader.readAsDataURL(blob); }) .catch(error => reject(error)); }); }

使用方法

引入方法--import {getImageStorage} from '../../../util/chatImage.js',根据实际项目写入正确路劲。

在首次获取图片资源的时候调用方法,实现数据缓存this.rulesImageUrl = await getImageStorage(res.data.rulesImageUrl);

http://www.jsqmd.com/news/988731/

相关文章:

  • AZ系、ZK系、WE系——一张牌号选型对照,加四种成型工艺的匹配逻辑
  • 有哪些真正好用的降AIGC网站?能同时搞定知网查重和降低AIGC率的那种
  • 非技术背景AIPM技术学习攻略:不学废、不内卷、刚好够用
  • AIOps 智能日志模式挖掘与异常关联:从日志海洋到结构化洞察
  • 数据的加密与解密(23:32)
  • 微信聊天记录永久备份终极指南:用WeChatExporter完整保存你的数字记忆
  • 集合 USB,AI ENC,AEC,BF,全面功能的语音处理模组
  • 2026年腾讯云OpenClaw/Hermes Agent配置Token Plan保姆级教程分享
  • 光伏电缆厂家盘点:从资质产能看选型适配方向 - 互联网科技品牌测评
  • 深入探讨KDB+函数的秩和参数验证
  • RedPanda-CPP轻量级C/C++ IDE架构解析与性能优化对比
  • 2026深圳中央空调回收品牌推荐:标杆企业领衔TOP5权威榜单 - 广东再生资源回收
  • MySQL数据库零基础入门,数据库原理、SQL详解、库表操作、字段约束、基础查询全覆盖
  • 2026年 电热管源头厂家推荐榜单:模温机电热管/单头法兰式/双头高温/PET电热管专业选购指南 - 品牌发掘
  • 如何在Windows上高效读写Btrfs分区:实用跨平台文件系统指南
  • 阳朔西街高性价比民宿推荐,舒适体验等你来享
  • 阅卷老师每天要看多少份试卷?机器帮了多少忙
  • Django+Vue双端权限系统模板,内置全国三级行政区划与一键容器化部署能力
  • 如何用Sunshine打造你的个人游戏云:终极开源串流服务器指南
  • LPC800 USART ISP协议详解与实战:构建稳定现场固件升级方案
  • MC68HC908MR24 TIMB定时器与SPI模块实战配置与避坑指南
  • GitHub 上 Stars 最多的 8 个开源 AI Assistant 工具
  • 回文子串(Palindromic Substrings)—— 题解
  • 拆解 GEO 底层技术壁垒:融景科技凭借两项自研国家软著,服务中铁、华润、碧桂园等头部企业,打破湛江 AI 优化市场贴牌工具困局 - 广东科技观察
  • 如何挑选正宗新疆干果:无添加养生特产选购攻略
  • 2026年广东GEO优化推广榜单:豆包/元宝/DeepSeek AI平台搜索代运营,助力制造业工厂与灯具五金家具行业精准营销 - 品牌发掘
  • 如何用HTTrack轻松实现网站全量备份与离线浏览:3种实用方法
  • 2026年惠州变压器回收品牌推荐与选择攻略 - 广东再生资源回收
  • NX许可回收无感测试,对比4款工具谁更隐形
  • SPI双缓冲机制与错误处理详解:从原理到实战避坑指南