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

前端缓存策略:让你的应用飞起来

前端缓存策略让你的应用飞起来一、引言又到了我这个毒舌工匠上线的时间了今天咱们来聊聊前端缓存策略这个话题。别以为缓存只是后端的事情前端缓存同样重要。一个好的缓存策略能够大大提高应用的性能和用户体验让你的应用飞起来。二、什么是前端缓存前端缓存就是将数据存储在浏览器中以便下次访问时能够快速获取而不需要从服务器重新请求。简单来说就是让浏览器记住一些数据下次用的时候直接拿不用再去服务器要。三、前端缓存的类型1. HTTP缓存HTTP缓存是基于HTTP协议的缓存机制包括强缓存和协商缓存。1.1 强缓存强缓存是指浏览器直接从缓存中获取资源不需要向服务器发送请求。相关HTTP头Expires指定资源的过期时间Cache-Control控制缓存的行为包括max-age、no-cache、no-store等代码示例// 服务器设置强缓存 app.get(/static/js/app.js, (req, res) { res.setHeader(Cache-Control, max-age31536000); // 1年 res.sendFile(path.join(__dirname, static/js/app.js)); });1.2 协商缓存协商缓存是指浏览器向服务器发送请求服务器根据请求头判断资源是否有更新如果没有更新则返回304 Not Modified浏览器从缓存中获取资源。相关HTTP头Last-Modified资源的最后修改时间If-Modified-Since浏览器发送的请求头包含资源的最后修改时间ETag资源的唯一标识符If-None-Match浏览器发送的请求头包含资源的ETag代码示例// 服务器设置协商缓存 app.get(/api/data, (req, res) { const data { message: Hello World }; const etag generateETag(data); if (req.headers[if-none-match] etag) { res.status(304).end(); return; } res.setHeader(ETag, etag); res.json(data); });2. 浏览器存储浏览器存储是指在浏览器中存储数据的机制包括 localStorage、sessionStorage、IndexedDB 等。2.1 localStoragelocalStorage是一种持久化的存储机制数据会一直存储在浏览器中直到被手动删除。代码示例// 存储数据 localStorage.setItem(user, JSON.stringify({ name: 张三, age: 20 })); // 获取数据 const user JSON.parse(localStorage.getItem(user)); // 删除数据 localStorage.removeItem(user); // 清空所有数据 localStorage.clear();2.2 sessionStoragesessionStorage是一种会话级别的存储机制数据只在当前会话中有效关闭浏览器窗口后数据会被删除。代码示例// 存储数据 sessionStorage.setItem(token, abc123); // 获取数据 const token sessionStorage.getItem(token); // 删除数据 sessionStorage.removeItem(token); // 清空所有数据 sessionStorage.clear();2.3 IndexedDBIndexedDB是一种功能强大的浏览器存储机制支持存储大量数据并且支持索引和事务。代码示例// 打开数据库 const request indexedDB.open(myDB, 1); request.onupgradeneeded (event) { const db event.target.result; // 创建对象存储空间 const store db.createObjectStore(users, { keyPath: id }); // 创建索引 store.createIndex(name, name, { unique: false }); }; request.onsuccess (event) { const db event.target.result; // 开始事务 const transaction db.transaction(users, readwrite); const store transaction.objectStore(users); // 添加数据 store.add({ id: 1, name: 张三, age: 20 }); // 获取数据 store.get(1).onsuccess (event) { console.log(event.target.result); }; // 提交事务 transaction.oncomplete () { db.close(); }; };3. Service Worker 缓存Service Worker 缓存是一种基于 Service Worker 的缓存机制能够实现离线访问。代码示例// service-worker.js const CACHE_NAME my-cache-v1; const urlsToCache [ /, /index.html, /static/js/app.js, /static/css/app.css ]; // 安装 Service Worker self.addEventListener(install, (event) { event.waitUntil( caches.open(CACHE_NAME) .then((cache) { console.log(Opened cache); return cache.addAll(urlsToCache); }) ); }); // 激活 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); }) ); });四、前端缓存的最佳实践1. 合理设置HTTP缓存合理设置HTTP缓存是前端缓存的基础。你应该根据资源的性质设置不同的缓存策略。静态资源对于长期不变的静态资源如图片、字体等使用强缓存设置较长的过期时间。对于经常变化的静态资源如JS、CSS等使用协商缓存或者在文件名中添加版本号。代码示例// 对于长期不变的静态资源 app.get(/static/images/logo.png, (req, res) { res.setHeader(Cache-Control, max-age31536000); // 1年 res.sendFile(path.join(__dirname, static/images/logo.png)); }); // 对于经常变化的静态资源 app.get(/static/js/app.js, (req, res) { res.setHeader(Cache-Control, no-cache); // 强制协商缓存 res.sendFile(path.join(__dirname, static/js/app.js)); });2. 使用浏览器存储存储用户数据使用浏览器存储存储用户数据是前端缓存的重要组成部分。你可以使用 localStorage 存储用户的偏好设置、购物车等数据使用 sessionStorage 存储会话相关的数据。代码示例// 存储用户偏好设置 localStorage.setItem(theme, dark); localStorage.setItem(fontSize, 16px); // 存储购物车数据 localStorage.setItem(cart, JSON.stringify([ { id: 1, name: 商品1, price: 100, quantity: 1 }, { id: 2, name: 商品2, price: 200, quantity: 2 } ])); // 存储会话相关的数据 sessionStorage.setItem(token, abc123); sessionStorage.setItem(userId, 123);3. 使用Service Worker实现离线访问使用Service Worker实现离线访问是前端缓存的高级应用。你可以使用 Service Worker 缓存静态资源实现离线访问。代码示例// service-worker.js const CACHE_NAME my-cache-v1; const urlsToCache [ /, /index.html, /static/js/app.js, /static/css/app.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(urlsToCache); }) ); }); // 激活 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) { return response; } const responseToCache response.clone(); caches.open(CACHE_NAME) .then((cache) { cache.put(event.request, responseToCache); }); return response; }); }) ); });4. 缓存策略的选择缓存策略的选择是前端缓存的关键。你应该根据资源的性质和应用的需求选择合适的缓存策略。常见的缓存策略Cache First优先从缓存中获取资源如果缓存中没有则从服务器获取。Network First优先从服务器获取资源如果网络请求失败则从缓存中获取。Stale While Revalidate从缓存中获取资源的同时从服务器获取新资源更新缓存。代码示例// Cache First 策略 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) { return response; } const responseToCache response.clone(); caches.open(CACHE_NAME) .then((cache) { cache.put(event.request, responseToCache); }); return response; }); }) ); }); // Network First 策略 self.addEventListener(fetch, (event) { event.respondWith( fetch(event.request) .then((response) { if (!response || response.status ! 200 || response.type ! basic) { return caches.match(event.request); } const responseToCache response.clone(); caches.open(CACHE_NAME) .then((cache) { cache.put(event.request, responseToCache); }); return response; }) .catch(() { return caches.match(event.request); }) ); }); // Stale While Revalidate 策略 self.addEventListener(fetch, (event) { event.respondWith( caches.match(event.request) .then((response) { const fetchPromise fetch(event.request) .then((networkResponse) { if (!networkResponse || networkResponse.status ! 200 || networkResponse.type ! basic) { return networkResponse; } const responseToCache networkResponse.clone(); caches.open(CACHE_NAME) .then((cache) { cache.put(event.request, responseToCache); }); return networkResponse; }) .catch(() { return response; }); return response || fetchPromise; }) ); });五、前端缓存的注意事项1. 缓存失效问题缓存失效问题是前端缓存的一个常见问题。你必须确保缓存能够及时更新避免用户看到过期的内容。解决方案使用版本号或哈希值作为文件名的一部分使用协商缓存使用Service Worker的缓存策略2. 存储空间限制存储空间限制是前端缓存的另一个常见问题。不同的浏览器存储机制有不同的存储空间限制。解决方案合理使用不同的存储机制定期清理过期数据监控存储空间的使用情况3. 安全性问题安全性问题是前端缓存的一个重要问题。你必须确保缓存中的数据是安全的避免敏感信息泄露。解决方案不要在前端存储敏感信息使用HTTPS对存储的数据进行加密六、总结前端缓存是一个重要的前端主题它能够大大提高应用的性能和用户体验。作为一名前端工程师你必须掌握前端缓存的相关知识和工具确保你的应用能够快速响应。最后我想说缓存不是小事它关系到你的应用的性能和用户体验。别以为缓存只是后端的事情前端缓存同样重要。一个好的缓存策略能够让你的应用飞起来。作者cannonmonster01日期2026-04-04标签前端缓存、HTTP缓存、浏览器存储、Service Worker、缓存策略

相关文章:

前端缓存策略:让你的应用飞起来

前端缓存策略:让你的应用飞起来 一、引言 又到了我这个毒舌工匠上线的时间了!今天咱们来聊聊前端缓存策略这个话题。别以为缓存只是后端的事情,前端缓存同样重要。一个好的缓存策略能够大大提高应用的性能和用户体验,让你的应用飞…...

前端可访问性:让所有人都能使用你的应用

前端可访问性:让所有人都能使用你的应用 一、引言 又到了我这个毒舌工匠上线的时间了!今天咱们来聊聊前端可访问性这个话题。别以为可访问性只是给残障人士用的,实际上,良好的可访问性能够让所有人都能更好地使用你的应用&#xf…...

51单片机(二) --- GPIO + 中断

一、GPIO 通用输入输出口GPIO(General Purpose Input Output)即通用目的输入输出口,是 51 单片机与外部设备进行数据交互的核心通道,51 单片机的 P0、P1、P2、P3 四组口均为 GPIO 口。与入门阶段仅用到的简单电平输出不同&#xf…...

大学生食品安全科普网页——web网页期末大作业

(文件先保存到自己网盘,谨防文件丢失!!) 源码获取地址 链接: https://pan.baidu.com/s/1r6C8_J31D01e1uG3FJi27w?pwdzxxh提取码: zxxhhtml科普网页源码 ✅ 网页一共6个页面 ✅ 网页使用html css js完成 布局简单 ✅…...

大学生保护动物网页——web网页期末大作业

(文件先保存到自己网盘,谨防文件丢失!!) 源码获取地址 链接: https://pan.baidu.com/s/1bz6nL9WPBBsxxWVmBAfGXw?pwdrcwi提取码: rcwihtml个人网页源码 ✅ 网页一共4个页面 ✅ 网页使用html css完成 布局简单 ✅ 文…...

说说 TCP 的三次握手:为什么是三次而不是两次或四次?

说说 TCP 的三次握手:为什么是三次而不是两次或四次?01. 前言:TCP 连接的“破冰仪式”02. 三次握手的完整流程2.1 流程图2.2 三个报文详解2.3 状态变化追踪03. 为什么需要三次握手?(核心问题)3.1 问题一&am…...

一台服务器最多能建立多少 TCP 连接:从理论极限到实际瓶颈

一台服务器最多能建立多少 TCP 连接:从理论极限到实际瓶颈01. 前言:一个经典却容易被答错的问题02. 核心原理:什么唯一标识一个 TCP 连接?03. 服务端 vs 客户端:限制完全不同3.1 服务端视角(如 Nginx、Tomc…...

TCP 是用来解决什么问题:从 IP 的不可靠到可靠的端到端通信

TCP 是用来解决什么问题:从 IP 的不可靠到可靠的端到端通信01. 前言:为什么有了 IP 还不够?02. IP 协议的四大先天缺陷03. TCP 要解决的六大核心问题04. 问题一:丢包 → 确认 超时重传4.1 问题描述4.2 TCP 的解决方案05. 问题二&…...

到底什么是 TCP 连接:从三次握手到四次挥手,从数据结构到状态机

到底什么是 TCP 连接:从三次握手到四次挥手,从数据结构到状态机01. 前言:每天都在用,却说不清它是什么02. 一句话定义03. TCP 连接不是物理的,而是逻辑的04. TCP 连接的核心标识:四元组05. TCP 连接在内核中…...

Python @contextmanager 装饰器完全指南

在Python编程实践中,资源管理是一个永恒的话题。无论是文件句柄、数据库连接还是临时状态变更,我们都需要确保资源被正确分配并在使用后得到妥善清理。虽然传统的try...finally语句可以解决这个问题,但Python提供了更加优雅的解决方案——上下…...

EC数据下载和可视化产品python实现

欧洲中期天气预报中心(ECMWF,European Centre for Medium-Range Weather Forecasts)是全球顶尖的气象研究和业务预报中心之一。其发布的数据,常被业内简称为“EC数据”,因高精度与高稳定性,是全球气象预报、…...

数据集成与 ETL 实践:从设计到优化

数据集成与 ETL 实践:从设计到优化 前言 作为一个在数据深渊里捞了十几年 Bug 的女码农,我深知数据集成和 ETL(Extract, Transform, Load)在企业数据管理中的重要性。随着数据量的爆炸式增长和数据来源的多样化,数据集…...

数据治理与数据质量:从策略到实践

数据治理与数据质量:从策略到实践 前言 作为一个在数据深渊里捞了十几年 Bug 的女码农,我深知数据治理和数据质量在企业数据管理中的重要性。随着数据量的爆炸式增长和数据类型的多样化,数据治理和数据质量已经成为企业数据管理的核心挑战。今…...

云原生数据库的设计与实践:从架构到部署

云原生数据库的设计与实践:从架构到部署 前言 作为一个在数据深渊里捞了十几年 Bug 的女码农,我深知云原生技术对数据库的影响。随着云计算的快速发展,云原生数据库已经成为数据库技术的重要发展方向。今天,我就来聊聊云原生数据库…...

网络协议封神考点:TCP协议是如何保证可靠传输的?原理+流程图+硬核详解

网络协议封神考点:TCP协议是如何保证可靠传输的?原理流程图硬核详解一、前言二、基础定义:什么是TCP可靠传输?三、TCP保证可靠传输的6大核心机制(必考)3.1 机制1:面向连接(三次握手 …...

Spring-AI 第 13 章 - 多模态消息处理详解

📚 理论基础 什么是多模态 AI? 多模态 AI(Multimodal AI) 是能够同时处理和生成多种类型数据(文本、图像、音频等)的人工智能系统。 多模态模型架构 ┌──────────────┐ ┌──────────────┐ │ 图像输入 │ │ 文本输入 …...

**发散创新:基于Go语言实现的Raft共识算法实战解析**在分布式系统中,**一

发散创新:基于Go语言实现的Raft共识算法实战解析 在分布式系统中,一致性是核心挑战之一。而Raft共识算法因其简洁性和可理解性,已成为当前主流的分布式一致性协议(如etcd、Consul均采用Raft)。本文将带你深入用Go语言从…...

# 发散创新:基于Python与Stable Diffusion的AI绘画自动化流程设计与实践

发散创新:基于Python与Stable Diffusion的AI绘画自动化流程设计与实践 在人工智能技术飞速发展的今天,AI绘画已从实验室走向大众创作场景。如何将这一前沿能力融入开发者工作流?本文以 Python Stable Diffusion API(如InvokeAI或…...

**发散创新:基于 Rust的微服务生态构建与性能优化实战**在现代云原生架构中,**Rust语言正迅速成为构建高并发、低延迟微服

发散创新:基于 Rust 的微服务生态构建与性能优化实战 在现代云原生架构中,Rust 语言正迅速成为构建高并发、低延迟微服务的首选工具之一。它不仅提供了媲美 C/C 的性能,还通过所有权机制彻底避免了内存安全问题。本文将围绕 Rust 在微服务生态…...

2026届最火的六大降重复率神器实际效果

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 目前人工智能生成内容大范围运用的情形下,致使 AIGC 检测识别率降低的工具适时出…...

场效应管MOS

场效应管 场效应管又称场效应晶体管(Field Effect Transistor,缩写为FET),它与三极管一样,具有放大能力。场效应管有漏极(D极)、栅极(G极)和源极(S极&#xf…...

5个突破边界技巧:OpenSpeedy游戏变速工具深度优化指南

5个突破边界技巧:OpenSpeedy游戏变速工具深度优化指南 【免费下载链接】OpenSpeedy 🎮 An open-source game speed modifier. 项目地址: https://gitcode.com/gh_mirrors/op/OpenSpeedy 副标题:如何通过用户态Hook技术实现游戏帧率自由…...

新手福音:在快马平台用AI生成openclaw命令实操案例,轻松入门运维自动化

作为一个刚接触运维的新手,第一次看到openclaw这个命令时确实有点懵。不过最近在InsCode(快马)平台上发现了一个超实用的功能,可以通过AI直接生成可运行的openclaw示例代码,还能实时测试效果,简直是新手福利!下面我就用…...

保姆级教程:在Quartus Prime 18.0中手把手配置NCO IP核并完成Modelsim仿真

保姆级教程:在Quartus Prime 18.0中手把手配置NCO IP核并完成Modelsim仿真 数字信号处理是FPGA开发中的核心技能之一,而数控振荡器(NCO)作为生成精确频率信号的关键IP核,在通信系统、雷达信号处理等领域有着广泛应用。…...

C语言三大控制结构:零基础学循环与选择

C语言编程里,控制结构用以构架程序逻辑,是新手入门的关键要点,掌握顺序、选择、循环这三大基本控制结构,可使你脱离单纯顺序代码编写,达成更复杂、更灵活的程序逻辑,本文会将C语言控制结构的核心知识点讲解…...

【深度解析】Hermes Agent:具备学习循环的开源 AI 代理如何落地到你的开发工作流?

摘要 Hermes Agent 是 News Research 推出的开源 AI Agent 系统,不只是“聊天包装器”,而是带有持久化记忆、自我技能学习与多通道接入的完整代理运行环境。本文从架构原理到落地实践,系统解析 Hermes 的学习循环、模型接入方式(云…...

CEEMDAN-VMD-Transformer-GRU二次分解+编码器+门控循环单元多元时间序列预测

一、研究背景 实际工程与科学数据(如振动信号、电力负荷、金融时序)常呈现非线性、非平稳特征,单一预测模型难以充分提取多尺度信息。为此,结合自适应信号分解(CEEMDAN、VMD)与深度学习(Transfo…...

针对波动计算复杂性的吸收边界条件(PML 用于一般波动方程)附Matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室🍊个人信条:格物致知,完整Matlab代码及仿真咨询…...

【LeetCode 刷题日】19.删除链表的倒数第n个节点

🔥个人主页:北极的代码(欢迎来访) 🎬作者简介:java后端学习者评论和 ❄️个人专栏:苍穹外卖日记,SSM框架深入,JavaWeb ✨命运的结局尽可永在,不屈的挑战却不可…...

【AI实战项目】项目六:知识图谱构建与应用实战

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程https://www.captainai.net/troubleshooter 项目背景: 在当今信息爆炸的时代,精准理解和应…...