前端缓存策略及其应用场景详解

 更新时间:2025年07月16日 09:34:23   作者:执梦起航  
缓存从来都是前端的一个痛点,很多前端搞不清楚缓存到底是何物这篇文章主要介绍了前端缓存策略及其应用场景的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前端缓存是提升网站性能和用户体验的关键技术,主要分为 浏览器缓存应用层缓存CDN缓存、内存缓存。以下是常见策略及其应用场景:

一、浏览器缓存(HTTP 缓存)

1. 强缓存(Cache-Control/Expires)

  • 原理:直接使用本地缓存,无需请求服务器。
  • 控制头
    • Cache-Control: max-age=3600(优先)
    • Expires: Wed, 21 Oct 2025 07:28:00 GMT(旧版,受本地时间影响)
  • 适用场景:静态资源(如 JS、CSS、图片)。
  • 示例配置(Nginx)
    location ~* \.(js|css|png|jpg|gif|svg)$ {
        expires 7d;  # 缓存 7 天
        add_header Cache-Control "public";
    }
    

2. 协商缓存(ETag/Last-Modified)

  • 原理:发送请求到服务器验证缓存是否可用,若未修改则返回 304。
  • 控制头
    • ETag: "123456789"(文件哈希值)
    • Last-Modified: Wed, 21 Oct 2025 07:28:00 GMT(文件修改时间)
  • 适用场景:可能变化但需精确控制的资源(如用户头像)。
  • 示例代码(Node.js)
    const http = require('http');
    const fs = require('fs');
    const crypto = require('crypto');
    
    http.createServer((req, res) => {
      fs.readFile('index.html', (err, data) => {
        const hash = crypto.createHash('md5').update(data).digest('hex');
        if (req.headers['if-none-match'] === hash) {
          res.statusCode = 304;
          return res.end();
        }
        res.setHeader('ETag', hash);
        res.end(data);
      });
    }).listen(3000);
    

二、应用层缓存

1. LocalStorage/SessionStorage

  • 特点
    • 存储大小:5-10MB(不同浏览器)。
    • 数据类型:字符串(需 JSON 序列化)。
    • 有效期:localStorage 永久,sessionStorage 会话结束清除。
  • 适用场景:用户偏好设置、临时数据(如购物车)。
  • 示例代码
    // 存储
    localStorage.setItem('user', JSON.stringify({ name: 'John', age: 30 }));
    
    // 读取
    const user = JSON.parse(localStorage.getItem('user'));
    

2. IndexedDB

  • 特点
    • 存储大小:无明确限制(受硬盘空间约束)。
    • 支持事务和索引,适合存储结构化数据。
    • 异步 API,避免阻塞主线程。
  • 适用场景:大量数据缓存(如离线地图、邮件客户端)。
  • 示例代码
    const request = indexedDB.open('myDatabase', 1);
    
    request.onsuccess = (event) => {
      const db = event.target.result;
      const transaction = db.transaction(['users'], 'readwrite');
      const store = transaction.objectStore('users');
      store.put({ id: 1, name: 'John' });
    };
    

3. Service Worker

  • 特点
    • 运行在浏览器后台的独立线程。
    • 拦截网络请求,实现离线缓存和推送通知。
  • 适用场景:离线应用(如 PWA)、静态资源预缓存。
  • 示例代码(注册 Service Worker)
    if ('serviceWorker' in navigator) {
      navigator.serviceWorker.register('/service-worker.js')
        .then(registration => {
          console.log('Service Worker 注册成功');
        });
    }
    
     
    // service-worker.js
    self.addEventListener('fetch', (event) => {
      event.respondWith(
        caches.match(event.request)
          .then(cachedResponse => cachedResponse || fetch(event.request))
      );
    });
    

三、CDN 缓存

  • 原理:内容分发网络在全球多个节点缓存资源,用户就近访问。
  • 优势
    • 加速静态资源加载(如 JS 库、图片)。
    • 减轻源服务器压力。
  • 示例配置(使用 UNPKG CDN)
    <script src="https://unpkg.com/react@18.2.0/umd/react.production.min.js"></script>
    

四、内存缓存(Runtime Cache)

  • 特点
    • 存储在 JS 变量中,读取速度极快。
    • 页面刷新后失效。
  • 适用场景:高频访问数据(如用户信息)。
  • 示例代码
    const cache = new Map();
    
    function getData(key) {
      if (cache.has(key)) {
        return cache.get(key);
      }
      const data = fetchDataFromServer(key);
      cache.set(key, data);
      return data;
    }
    

五、缓存策略选择指南

场景推荐缓存方案
静态资源(JS/CSS/ 图片)HTTP 强缓存 + CDN
动态数据(如 API 响应)协商缓存 + LocalStorage
离线应用Service Worker + IndexedDB
高频数据访问内存缓存(如 Map 对象)、vuex、pina
用户会话信息SessionStorage

总结

到此这篇关于前端缓存策略及其应用场景详解的文章就介绍到这了,更多相关前端缓存策略内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript中的几种内置数据结构

    JavaScript中的几种内置数据结构

    本文介绍了JavaScript中的几种内置数据结构,包括Array、Set、Map和Object,以及它们的特点和适用场景,通过比较这些数据结构的性能和特性,帮助开发者根据具体需求选择最合适的结构,感兴趣的朋友跟随小编一起看看吧
    2026-02-02
  • 用JS实现飞机大战小游戏

    用JS实现飞机大战小游戏

    这篇文章主要为大家详细介绍了用JS实现飞机大战小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • JavaScript实现公历转农历功能示例

    JavaScript实现公历转农历功能示例

    这篇文章主要介绍了JavaScript实现公历转农历功能,涉及javascript日期与时间相关操作及运算操作技巧,需要的朋友可以参考下
    2017-02-02
  • 自定义javascript验证框架示例【附源码下载】

    自定义javascript验证框架示例【附源码下载】

    这篇文章主要介绍了自定义javascript验证框架,结合实例形式分析了javascript正则验证相关操作技巧,并附带源码供读者下载参考,需要的朋友可以参考下
    2019-05-05
  • javascript超过容器后显示省略号效果的方法(兼容一行或者多行)

    javascript超过容器后显示省略号效果的方法(兼容一行或者多行)

    下面小编就为大家带来一篇javascript超过容器后显示省略号效果的方法(兼容一行或者多行)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-07-07
  • 手把手教你实现一个JavaScript时间轴组件

    手把手教你实现一个JavaScript时间轴组件

    本文主要是给大家带来一个时间轴的组件开发教程,其主要功能就是可以拖动时间轴来定位当前时间,可以通过鼠标滚轮来修改当前时间分辨率,需要的可以参考一下
    2022-10-10
  • js动画(animate)简单引擎代码示例

    js动画(animate)简单引擎代码示例

    仿照flash的动画原理,自己写了一个非常简单的js动画引擎。
    2012-12-12
  • javascript父子页面通讯实例详解

    javascript父子页面通讯实例详解

    这篇文章主要介绍了javascript父子页面通讯的实现方法,实例分析了javascript针对父子页面通讯的原理与相关实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • JavaScript图像延迟加载库Echo.js

    JavaScript图像延迟加载库Echo.js

    Echo 是一个独立的 JavaScript 懒加载图像的工具,快速、体积小(不足1k)和使用 HTML5 的 data- 属性,通过本文给大家介绍JavaScript图像延迟加载库Echo.js ,感兴趣的朋友一起学习吧
    2016-04-04
  • JavaScript订单操作小程序完整版

    JavaScript订单操作小程序完整版

    这篇文章主要介绍了JavaScript订单操作小程序完整版,增加订单,删除订单,修改订单数量,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06

最新评论