前端缓存策略:让你的网站飞起来

前端缓存策略:让你的网站飞起来

毒舌时刻

前端缓存?这不是浏览器的事吗?

"我不需要管缓存,浏览器会自动处理"——结果网站加载慢,用户体验差,
"缓存就是localStorage嘛,多简单"——结果缓存管理混乱,内存占用高,
"我直接禁用缓存,省得麻烦"——结果每次都重新加载,浪费带宽。

醒醒吧,前端缓存不是简单的localStorage,而是一套完整的策略!

为什么你需要这个?

  • 性能提升:减少重复请求,加快页面加载速度
  • 用户体验:离线访问,减少等待时间
  • 带宽节省:减少服务器流量,降低成本
  • 可靠性:网络不稳定时仍能正常访问

反面教材

// 反面教材:滥用localStorage function fetchData() { // 每次都从API获取数据 return fetch('https://api.example.com/data') .then(res => res.json()) .then(data => { // 直接存储到localStorage localStorage.setItem('data', JSON.stringify(data)); return data; }); } // 反面教材:没有缓存失效策略 function getCachedData() { // 永远使用缓存,不考虑过期 const cachedData = localStorage.getItem('data'); return cachedData ? JSON.parse(cachedData) : null; } // 反面教材:缓存键命名混乱 function cacheData(key, data) { // 缓存键没有统一规范 localStorage.setItem(`cache_${key}_${Date.now()}`, JSON.stringify(data)); } 

正确的做法

// 正确的做法:完整的缓存策略 class CacheManager { constructor() { this.cachePrefix = 'app_cache_'; this.defaultExpiry = 24 * 60 * 60 * 1000; // 24小时 } // 生成缓存键 generateKey(key) { return `${this.cachePrefix}${key}`; } // 存储数据到缓存 set(key, data, expiry = this.defaultExpiry) { const cacheItem = { data, expiry: Date.now() + expiry, timestamp: Date.now() }; try { localStorage.setItem(this.generateKey(key), JSON.stringify(cacheItem)); } catch (error) { console.error('Cache storage error:', error); // 处理存储空间不足的情况 this.clearOldCache(); } } // 从缓存获取数据 get(key) { const cacheItem = localStorage.getItem(this.generateKey(key)); if (!cacheItem) { return null; } try { const parsedItem = JSON.parse(cacheItem); // 检查是否过期 if (Date.now() > parsedItem.expiry) { this.remove(key); return null; } return parsedItem.data; } catch (error) { console.error('Cache parsing error:', error); this.remove(key); return null; } } // 移除缓存 remove(key) { localStorage.removeItem(this.generateKey(key)); } // 清空所有缓存 clear() { Object.keys(localStorage).forEach(key => { if (key.startsWith(this.cachePrefix)) { localStorage.removeItem(key); } }); } // 清理过期缓存 clearOldCache() { Object.keys(localStorage).forEach(key => { if (key.startsWith(this.cachePrefix)) { try { const item = JSON.parse(localStorage.getItem(key)); if (Date.now() > item.expiry) { localStorage.removeItem(key); } } catch (error) { localStorage.removeItem(key); } } }); } // 获取缓存大小 getCacheSize() { let size = 0; Object.keys(localStorage).forEach(key => { if (key.startsWith(this.cachePrefix)) { size += localStorage.getItem(key).length; } }); return size; } } // 正确的做法:使用Service Worker缓存 // service-worker.js const CACHE_NAME = 'app-cache-v1'; const ASSETS_TO_CACHE = [ '/', '/index.html', '/manifest.json', '/static/js/main.js', '/static/css/main.css', '/static/images/logo.png' ]; // 安装Service Worker self.addEventListener('install', event => { event.waitUntil( caches.open(CACHE_NAME) .then(cache => { console.log('Opened cache'); return cache.addAll(ASSETS_TO_CACHE); }) ); }); // 激活Service Worker self.addEventListener('activate', event => { const cacheWhitelist = [CACHE_NAME]; event.waitUntil( caches.keys().then(cacheNames => { return Promise.all( cacheNames.map(cacheName => { if (cacheWhitelist.indexOf(cacheName) === -1) { return caches.delete(cacheName); } }) ); }) ); }); // 拦截网络请求 self.addEventListener('fetch', event => { event.respondWith( caches.match(event.request) .then(response => { // 如果缓存中有响应,直接返回 if (response) { return response; } // 否则发起网络请求 return fetch(event.request) .then(response => { // 如果响应有效,缓存一份 if (response && response.status === 200 && response.type === 'basic') { const responseToCache = response.clone(); caches.open(CACHE_NAME) .then(cache => { cache.put(event.request, responseToCache); }); } return response; }); }) ); }); // 正确的做法:API请求缓存 async function fetchWithCache(url, options = {}) { const cacheKey = `api_${url}_${JSON.stringify(options)}`; const cacheManager = new CacheManager(); // 尝试从缓存获取 const cachedData = cacheManager.get(cacheKey); if (cachedData) { return cachedData; } // 发起网络请求 const response = await fetch(url, options); const data = await response.json(); // 缓存数据 cacheManager.set(cacheKey, data, 5 * 60 * 1000); // 5分钟过期 return data; } 

毒舌点评

看看,这才叫前端缓存策略!不是简单地使用localStorage,而是构建一套完整的缓存管理系统,包括过期策略、空间管理、Service Worker等。

记住,缓存不是越多越好,而是要合理使用。你需要根据数据的性质和使用频率,选择合适的缓存策略。

所以,别再觉得缓存是浏览器的事了,它是前端性能优化的重要组成部分!

总结

  • localStorage:适合存储小量、不敏感的数据
  • sessionStorage:适合存储会话期间的数据
  • IndexedDB:适合存储大量结构化数据
  • Service Worker:适合缓存静态资源和API响应
  • 缓存策略:合理设置过期时间,定期清理过期缓存
  • 缓存键管理:使用统一的命名规范,避免缓存键冲突
  • 错误处理:处理存储空间不足等异常情况
  • 性能监控:监控缓存命中率,不断优化缓存策略

前端缓存,让你的网站飞起来!

Read more

自动驾驶用户指令解析模型:Llama-Factory交通出行应用

自动驾驶用户指令解析模型:Llama-Factory交通出行应用 在智能汽车日益普及的今天,驾驶员与车辆之间的交互方式正经历深刻变革。过去,我们通过按钮、旋钮或简单的语音命令控制导航;而现在,用户更希望用自然语言表达复杂意图——“前面堵车了,能不能绕一下?”、“找个最近能充电的地方”、“我有点累,帮我找家附近的酒店”。这些看似随意的话语,背后却对系统的语义理解能力提出了极高要求。 传统车载语音系统依赖规则引擎和关键词匹配,面对口语化、多义性甚至隐含需求时常常束手无策。而通用大语言模型虽然具备强大的语言理解能力,但直接部署成本高、响应延迟大,且缺乏领域专业知识。如何在有限资源下,快速构建一个懂交通、听人话、可落地的指令解析模型?这正是 Llama-Factory 所要解决的核心问题。 从数据到部署:一体化微调实践路径 Llama-Factory 并非只是另一个训练脚本集合,它是一个真正面向工程落地的全周期框架。它的价值不在于炫技式的算法堆叠,而在于将复杂的深度学习流程封装成可复用、易操作的标准模块,让团队能把精力集中在“做什么”而非“怎么做”。 以中文交通指令解析任务为例,整

LLaMA Factory 从入门到精通,一篇讲完

LLaMA Factory 从入门到精通,一篇讲完

目录 一、LLaMA-Factory 简介 二、安装部署 三、数据微调 1、数据集的建立 2、数据集格式 3、模型参数 4、开始运行 5、导出模型 四、webui 评估预测与对话 导出 五、SFT 训练 命令行 六、LoRA 合并 合并 量化 七、推理 原始模型推理配置 微调模型推理配置 多模态模型 批量推理 八、评估 通用能力评估 NLG 评估 评估相关参数 一、LLaMA-Factory 简介 LLaMA Factory 是一个简单易用且高效的大型语言模型(Large

Stable-Diffusion-v1-5-archive中文提示词避坑指南:英文翻译策略与参数调优

Stable-Diffusion-v1-5-archive中文提示词避坑指南:英文翻译策略与参数调优 你是不是也遇到过这样的问题:用Stable Diffusion v1.5 Archive生成图片,明明输入了很详细的中文描述,结果出来的图却“货不对板”?要么是细节缺失,要么是风格跑偏,甚至完全理解错了你的意思。 这其实不是你的问题,而是SD1.5模型的一个“先天特性”——它对英文的理解能力远超中文。直接使用中文提示词,就像让一个只会说英语的人去听中文指令,效果自然大打折扣。 别担心,这篇文章就是为你准备的“避坑指南”。我会带你深入理解为什么中文提示词在SD1.5上效果不佳,并分享一套经过验证的、从中文到英文的翻译策略和参数调优方法。看完之后,你就能稳定地生成出符合预期的精美图片,彻底告别“抽卡”式的随机结果。 1. 为什么中文提示词在SD1.5上“水土不服”? 在开始讲“怎么做”之前,我们先要搞清楚“为什么”。理解背后的原因,能帮你更好地应用后面的技巧,而不是死记硬背。 1.1 模型训练的“语言偏好”

体验Stable Diffusion 3.5省钱攻略:比买显卡省90%,按需付费

体验Stable Diffusion 3.5省钱攻略:比买显卡省90%,按需付费 你是不是也遇到过这样的情况:作为自由职业者,客户突然发来一个AI绘画项目需求,说“先做个样图看看效果”。你心里一紧——要测试 Stable Diffusion 3.5 吗?可自己电脑跑不动,租专业显卡又太贵,动辄每月上千元,就为了做几次测试,实在不划算。 别急,我最近发现了一个超低成本的解决方案:用云端算力平台按小时计费的方式,部署 Stable Diffusion 3.5 镜像,完成一次高质量图像生成测试,总成本不到10块钱!相比动辄上万元买显卡或每月固定租赁高端GPU,直接省下90%以上的费用。 这篇文章就是为你量身打造的“小白友好型”实操指南。我会带你一步步从零开始,在ZEEKLOG星图提供的预置镜像环境中,快速启动 Stable Diffusion 3.5,生成专业级图像,并掌握关键参数调优技巧。无论你是设计师、