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

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

毒舌时刻

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

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

Magic API:低代码接口开发平台完全指南

Magic API:低代码接口开发平台完全指南

Magic API:低代码接口开发平台完全指南 🌟 你好,我是 励志成为糕手 ! 🌌 在代码的宇宙中,我是那个追逐优雅与性能的星际旅人。 ✨ 每一行代码都是我种下的星光,在逻辑的土壤里生长成璀璨的银河; 🛠️ 每一个算法都是我绘制的星图,指引着数据流动的最短路径; 🔍 每一次调试都是星际对话,用耐心和智慧解开宇宙的谜题。 🚀 准备好开始我们的星际编码之旅了吗? 目录 * Magic API:低代码接口开发平台完全指南 * 摘要 * 1. Magic API概述与核心概念 * 1.1 什么是Magic API * 1.2 Magic API的核心特性 * 1.3 Magic API的设计理念 * 2. Magic API架构设计与组件分析 * 2.1 整体架构概览 * 2.2 API引擎工作原理 * 2.3 脚本引擎与SQL执行机制 * 3. Magic API核心功能实现

【机器人】具身导航 VLN 最新论文汇总 | Vision-and-Language Navigation

【机器人】具身导航 VLN 最新论文汇总 | Vision-and-Language Navigation

本文汇总了具身导航的论文,供大家参考学习,涵盖2026、2025、2024、2023等 覆盖的会议和期刊:CVPR、IROS、ICRA、RSS、arXiv等等 论文和方法会持续更新的~ 一、🏠 中文标题版 2026 ✨ * [2026] SeqWalker:基于分层规划的时序视野视觉语言导航方法 [ 论文 ] [ GitHub ]   * [2026] UrbanNav:从网络规模人类轨迹中学习语言引导的城市导航方法 [ 论文 ] [ GitHub ]  * [2026] VLN-MME:面向语言引导视觉导航智能体的多模态大语言模型诊断基准 [ 论文 ] [ GitHub ]  * [2026] ASCENT: 实现楼层感知的零样本物体目标导航  [ 论文] [ GitHub ] 2025 😆 * [2025] ETP-R1:面向连续环境VLN的进化拓扑规划与强化微调方法 [ 论文 ] [ GitHub ] * [2025] NaviTrace:评估视觉语言模型在真实世界场景中的导航能力 [ 论文 ] [ GitHub ] * [2025]

【花雕学编程】Arduino BLDC 之自主巡逻机器人(避障+路径规划)

【花雕学编程】Arduino BLDC 之自主巡逻机器人(避障+路径规划)

基于 Arduino 的无刷直流电机(BLDC)自主巡逻机器人(避障+路径规划),是一个融合了高效动力系统、多传感器环境感知、嵌入式实时计算与智能决策算法的复杂移动机器人系统。它旨在替代人工在预设或未知环境中进行长时间、高效率的巡查任务,通过 BLDC 电机提供持久且敏捷的驱动力,并利用算法实现环境理解与自主导航。 1、主要特点 高效长续航 BLDC 驱动系统 BLDC 电机是巡逻机器人的“心脏”,决定了其机动性与作业时长。 高效率与长续航: 相较于有刷电机,BLDC 电机效率通常高于 85%,发热量低。配合电子调速器(ESC)的 FOC(磁场定向控制)算法,能最大限度地利用电池能量,确保机器人能够持续工作 8 小时甚至更长时间,满足长时间巡逻的需求。 高动态响应: 巡逻过程中常需急停、避让行人或车辆。BLDC 电机具备快速启停和快速加减速的能力,配合差速转向底盘,能迅速响应避障算法发出的紧急制动或转向指令,保证运行安全。

12-Web3前端安全:连接钱包的风险与防护

Web3前端安全:连接钱包的风险与防护 大家好,我是十六咲子。 随着区块链技术的快速发展,Web3应用已经成为互联网的新趋势。从去中心化金融(DeFi)到非同质化通证(NFT),从去中心化社交网络到元宇宙,Web3应用正在重塑我们与数字世界的交互方式。然而,Web3的去中心化特性也带来了新的安全挑战,特别是在前端开发中。钱包连接、签名验证、智能合约交互等操作都可能成为攻击者的目标。 Web3前端安全风险分析 1. 钱包连接安全 常见风险: * 钓鱼网站诱导用户连接恶意钱包 * 钱包地址输入错误导致资产损失 * 未授权的钱包连接请求 * 钱包连接过程中的中间人攻击 真实案例:某DeFi项目的前端被黑客攻击,修改了钱包连接代码,导致用户的签名请求被重定向到攻击者的地址,造成大量资产被盗。 2. 签名验证安全 潜在威胁: * 恶意签名请求(如伪造的交易授权) * 签名消息内容不明确导致用户误签 * 签名验证逻辑漏洞 * 重放攻击(Replay Attack) 3. 智能合约交互安全 关键风险: * 与恶意智能合约交互 * 智能合约漏洞利用 *