CacheStorage详解

本文涉及的产品
资源编排,不限时长
无影云电脑企业版,4核8GB 120小时 1个月
无影云电脑个人版,1个月黄金款+200核时
简介: CacheStorage 是 Web API 的一部分,用于管理缓存对象的存储。它允许开发者在客户端存储和检索请求-响应对,实现离线访问和性能优化。通过 CacheStorage 接口,可以创建、删除和查询缓存,以及控制资源的缓存策略。
  1. CacheStorage的基本概念

    • 定义与作用:CacheStorage是浏览器提供的一种存储机制,用于缓存网络资源,如脚本、样式表、图片等。它是Service Worker API的一部分,目的是为了提高网页的性能和离线可用性。例如,当用户第一次访问一个网页时,浏览器可以将网页的一些关键资源(如HTML文件、主要的CSS和JavaScript文件)存储到CacheStorage中。当下次访问该网页或者在离线状态下再次请求这些资源时,浏览器可以直接从CacheStorage中获取,而不必重新从网络下载,从而加快了网页的加载速度。
    • 与其他存储机制的关系:与localStorage和sessionStorage不同,CacheStorage主要用于缓存网络请求的响应,并且存储的内容通常是由浏览器或Service Worker自动管理的。而localStorage和sessionStorage主要用于存储应用程序的数据,如用户的偏好设置、登录状态等,并且是通过JavaScript代码显式地进行存储和读取操作。
  2. CacheStorage的使用方法

    • 打开和获取缓存(Cache)对象
      • 可以通过caches.open()方法来打开一个指定名称的缓存。如果缓存不存在,则会创建一个新的缓存。例如:
        caches.open('my - cache - name').then((cache) => {
                 
          // 在这里可以使用cache对象进行操作
        });
        
      • 打开缓存后,可以使用cache对象进行各种操作,如添加、匹配和删除缓存项。
    • 添加缓存项
      • 可以使用cache.addAll()方法来添加一组资源到缓存中。这些资源通常是通过网络请求获取的响应。例如,在Service Worker中,可以这样添加缓存项:
        self.addEventListener('fetch', function (event) {
                 
          event.respondWith(
              caches.open('my - cache - name').then((cache) => {
                 
                  return cache.addAll([
                      '/',
                      '/index.html',
                      '/styles.css',
                      '/script.js'
                  ]);
              })
          );
        });
        
      • 上述代码在fetch事件中,当Service Worker拦截到网络请求时,会尝试将指定的资源添加到名为my - cache - name的缓存中。
    • 匹配缓存项
      • 使用cache.match()方法可以在缓存中查找与给定请求匹配的缓存项。例如,在Service Worker的fetch事件处理程序中,可以这样使用:
        self.addEventListener('fetch', function (event) {
                 
          event.respondWith(
              caches.open('my - cache - name').then((cache) => {
                 
                  return cache.match(event.request).then((response) => {
                 
                      if (response) {
                 
                          return response;
                      }
                      return fetch(event.request);
                  });
              })
          );
        });
        
      • 这段代码首先尝试从缓存中查找与请求匹配的响应,如果找到则直接返回缓存中的响应,否则通过fetch方法从网络获取响应。
    • 删除缓存项和缓存本身
      • 可以使用cache.delete()方法删除缓存中的单个项目。例如,要删除一个特定的URL对应的缓存项,可以这样做:
        caches.open('my - cache - name').then((cache) => {
                 
          cache.delete('/old - resource.html');
        });
        
      • 要删除整个缓存,可以使用caches.delete()方法并指定缓存的名称。例如:
        caches.delete('my - cache - name');
        
  3. CacheStorage的生命周期和缓存策略

    • 缓存的生命周期
      • 缓存项在CacheStorage中的存储时间是由缓存策略决定的。一些缓存可能会一直存储,直到用户手动清除浏览器缓存或者缓存被代码显式删除。而另一些缓存可能会根据一定的规则(如缓存过期时间、资源更新情况等)自动更新或清除。
      • 例如,在设置缓存时,可以通过在响应头中添加Cache - ControlExpires等字段来指定缓存的有效期。浏览器会根据这些信息来判断何时需要重新获取资源,而不是使用缓存中的旧资源。
    • 缓存策略
      • 强缓存策略:如果响应头中有Cache - Control: max - age = 31536000(表示缓存有效期为一年)这样的设置,并且缓存尚未过期,浏览器会直接使用缓存中的资源,而不会发送网络请求。这种策略适用于那些很少变化的资源,如网站的图标、一些基础的JavaScript库等。
      • 协商缓存策略:当响应头中有Last - ModifiedETag等字段时,浏览器在使用缓存资源之前会先发送一个条件请求(例如,在请求头中带上If - Modified - SinceIf - None - Match字段)到服务器,询问资源是否已经更新。如果服务器返回304 Not Modified响应,表示资源没有更新,浏览器继续使用缓存中的资源;如果服务器返回新的资源内容,浏览器更新缓存并使用新资源。这种策略适用于那些可能会定期更新的资源,如网页的HTML文件等。
相关文章
|
8月前
|
数据采集 缓存 数据挖掘
什么是代理IP?代理IP有什么用途
什么是代理IP?代理IP有什么用途
205 0
|
2月前
|
存储 缓存 前端开发
如何使用 CacheStorage 实现离线缓存
CacheStorage 是一种在客户端存储数据的 API,适用于 Service Worker。通过它,可以实现网页资源的离线缓存,提高应用加载速度和用户体验。使用时,先打开缓存,然后添加、获取或删除资源,确保应用即使在网络不可用时也能正常运行。
|
SQL 关系型数据库 MySQL
ShardingSphere-Sharding-Proxy(安装和分表配置)| 学习笔记
快速学习ShardingSphere-Sharding-Proxy(安装和分表配置)。
ShardingSphere-Sharding-Proxy(安装和分表配置)| 学习笔记
|
2月前
|
安全 Java 编译器
什么是AOP面向切面编程?怎么简单理解?
本文介绍了面向切面编程(AOP)的基本概念和原理,解释了如何通过分离横切关注点(如日志、事务管理等)来增强代码的模块化和可维护性。AOP的核心概念包括切面、连接点、切入点、通知和织入。文章还提供了一个使用Spring AOP的简单示例,展示了如何定义和应用切面。
253 1
什么是AOP面向切面编程?怎么简单理解?
|
3月前
|
JavaScript 数据处理
Vuex 的Mutation 和 Action 有什么区别?
【10月更文挑战第15天】Mutation 和 Action 在 Vuex 中都有着重要的作用,它们相互协作,共同实现了 Vuex 状态管理的功能。理解它们的区别与联系,并在实际应用中正确使用,对于构建高效、可靠的 Vue 应用具有重要意义。
|
3月前
|
JavaScript API
|
5月前
|
存储 监控 算法
强密码策略 防止暴力破解
【8月更文挑战第14天】
294 2
|
3月前
ThreeJs模拟工厂生产过程一
这篇文章详细介绍了如何使用Three.js模拟工厂生产过程的第一部分,包括创建传送带、生产设备和产品的模型,并实现产品沿传送带移动的动画效果。
94 5
|
5月前
|
网络协议
Mac根据端口查询进程id的命令
这篇文章介绍了在Mac操作系统上如何使用两种命令来查询监听特定端口的进程ID。第一种方法是使用`netstat -anp tcp -v | grep 端口号`,例如`netstat -anp tcp -v | grep 80`,这将列出所有使用端口80的TCP连接及其相关信息。第二种方法是使用`lsof -P -n -i:端口号`,例如`lsof -P -n -i:8080`,这将显示使用指定端口的进程列表,包括进程ID、用户、文件描述符等信息。文章通过示例展示了如何使用这些命令,并提供了输出结果的截图。
395 2
|
5月前
|
API Android开发 Kotlin
Android实战经验分享之如何获取状态栏和导航栏的高度
在Android开发中,掌握状态栏和导航栏的高度对于优化UI布局至关重要。本文介绍两种主要方法:一是通过资源名称获取,简单且兼容性好;二是利用WindowInsets,适用于新版Android,准确性高。文中提供了Kotlin代码示例,并对比了两者的优缺点及适用场景。
428 1

热门文章

最新文章