跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python

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

前端缓存策略:让你的网站飞起来 毒舌时刻 前端缓存?这不是浏览器的事吗? "我不需要管缓存,浏览器会自动处理"——结果网站加载慢,用户体验差, "缓存就是localStorage嘛,多简单"——结果缓存管理混乱,内存占用高, "我直接禁用缓存,省得麻烦"——结果每次都重新加载,浪费带宽。 醒醒吧,前端缓存不是简单的localStorage,而是一套完整的策略! 为什么你需要这个? **性能提升**…

灰度发布发布于 2026/4/6更新于 2026/5/22194 浏览

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

毒舌时刻

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

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

毒舌点评

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

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

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

总结

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

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

目录

  1. 前端缓存策略:让你的网站飞起来
  2. 毒舌时刻
  3. 为什么你需要这个?
  4. 反面教材
  5. 正确的做法
  6. 毒舌点评
  7. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • ToDesk ToClaw 评测:基于 OpenClaw 的零门槛 AI 自动化方案
  • 前端实现“记住密码”功能的原理与方案
  • LLM 大模型开源教程项目突破 34.4k Star,涵盖基础到工程化
  • 2026 前端跨端框架选型指南
  • Cortex-R52+ 架构深度解析与国产芯片实战
  • 前端代码分割与懒加载实践
  • STL 转 STEP 格式转换核心技术与实践
  • 文心大模型 4.5 轻量化部署实践与能力验证
  • Web 团队构建 App:Capacitor 选型指南
  • OpenClaw AI 智能体部署与使用指南
  • MaxKB4j 基于 Java 的开源 RAG 知识库平台技术解析
  • 2019 年信奥赛 C++ 提高组 CSP-S 初赛真题解析(选择题 11-15)
  • RocksDB 在鲲鹏架构下的性能优化源码解析
  • Cursor, Kiro 与 Google Antigravity 重新定义编程工具对比
  • VLA 机器人技术解析:10 篇关键视觉 - 语言 - 动作模型论文
  • Cursor+Codex 截图调试前端 Bug 实战(React/Chakra UI 案例)
  • Antigravity 集成 Figma MCP 实现像素级还原 AI 编程
  • Linux 模拟实现:编写微型 Bash 解释器
  • 七款主流大模型英文降 AI 率效果横向测评
  • Cursor 与 GitHub Copilot 深度对比:架构、性能与选型指南

相关免费在线工具

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online