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

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

毒舌时刻

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

"我不需要管缓存,浏览器会自动处理"——结果网站加载慢,用户体验差,
"缓存就是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

[源力觉醒 创作者计划]_文心一言 4.5开源深度解析:性能狂飙 + 中文专精

[源力觉醒 创作者计划]_文心一言 4.5开源深度解析:性能狂飙 + 中文专精

文章目录 * [源力觉醒 创作者计划]_文心一言 4.5开源深度解析:性能狂飙 + 中文专精 * 一. 部署实战:单卡环境的极速落地 * 1.1 🖥️ 环境配置の手把手教程 📝 * 部署准备:硬件与镜像 * 依赖安装:一行代码搞定 * 1.2 🚀 模型启动の参数与验证 ✅. * 二. 多场景能力验证:从工业到学术 * 2.1 🏥 医疗影像诊断:从模糊影像到病灶定位 * 2.2 🚦 交通流优化:动态拥堵预测与策略设计 * 2.3 🔍 考古文本破译:甲骨文符号的跨学科解读 * 三. 性能优化与问题解决 * 3.1 🚀 性能优化策略:让模型跑得更快 * 3.2 🛠️ 常见错误解决方案 * 四. 与同类模型对比 * 🍬 核心优势对比🍭 * 🍬 对比结论🍭 * 五、

无需联网!在 Windows 电脑上用 Llama-3-8B 搭建个人知识问答助手(超详细实战指南)

一、为什么你需要一个“本地知识问答助手”? 你是否遇到过以下场景? * 读了几十篇论文,却记不清某篇的关键结论? * 公司内部文档散落在多个 Word/PDF 中,查找效率低下? * 想快速回顾自己写的项目笔记,但 Ctrl+F 太慢? * 担心把敏感数据上传到云端 AI(如 ChatGPT)造成泄露? 解决方案来了! 本文将手把手教你,在 一台普通的 Windows 电脑(带 NVIDIA 显卡)上,利用开源大模型 Llama-3-8B + Ollama + LangChain + Chroma 向量数据库,搭建一个完全离线、无需联网、数据私有的个人知识问答系统。 输入问题 → 自动检索你的文档 → 生成精准答案 所有数据留在本地,绝不外传! 二、硬件与软件环境要求 1. 硬件配置(最低

【Claude Code解惑】深度评测:Claude Code vs. GitHub Copilot CLI,谁才是终端之王?

【Claude Code解惑】深度评测:Claude Code vs. GitHub Copilot CLI,谁才是终端之王?

深度评测:Claude Code vs. GitHub Copilot CLI,谁才是终端之王? 目录 1. 引言与背景 2. 原理解释(深入浅出) 3. 10分钟快速上手(可复现) 4. 代码实现与工程要点 5. 应用场景与案例 6. 实验设计与结果分析 7. 性能分析与技术对比 8. 消融研究与可解释性 9. 可靠性、安全与合规 10. 工程化与生产部署 11. 常见问题与解决方案(FAQ) 12. 创新性与差异性 13. 局限性与开放挑战 14. 未来工作与路线图 15. 扩展阅读与资源 16. 图示与交互 17. 术语表与速查表 18. 互动与社区 0.

基于10种AI写作工具,快速重构数学建模优秀论文框架,辅以智能改写技术增强可读性。

基于10种AI写作工具,快速重构数学建模优秀论文框架,辅以智能改写技术增强可读性。

AI工具的核心对比分析显示,以下10款工具在功能侧重、响应速度及跨平台兼容性上存在显著差异,尤其适合Java毕业论文场景的高效筛选:ChatGPT以语义重构能力强著称,平均处理耗时3秒且支持全平台;Grammarly专注语法优化,桌面端响应仅1秒;QuillBot擅长段落重组,Web端延迟约5秒;Jasper提供长文改写模板,企业级API响应稳定在2秒内;Copy.ai侧重创意生成,移动端适配优秀;Wordtune支持实时协作编辑,云同步速度达毫秒级;ProWritingAid集成深度分析,Windows/Mac双平台平均4秒处理;Hemingway突出简洁风格优化,浏览器插件即开即用;Writesonic强化学术术语处理,API延迟控制在1.5秒;Rytr具备多语言支持特性,跨设备同步响应不超过3秒。各工具在语义理解深度、专业术语库及学术规范适配度等维度形成差异化优势矩阵。 工具名称 主要用途 处理时间 适配平台 关键优势 askpaper 降AIGC率,降重复率 约20分钟 知网、格子达、维普 AIGC检测精准,保留学术语义 aicheck 降AIGC率