如何使用 CacheStorage 实现离线缓存

简介: CacheStorage 是一种在客户端存储数据的 API,适用于 Service Worker。通过它,可以实现网页资源的离线缓存,提高应用加载速度和用户体验。使用时,先打开缓存,然后添加、获取或删除资源,确保应用即使在网络不可用时也能正常运行。
  1. 注册Service Worker

    • 首先,要在网页中注册Service Worker。Service Worker是一种在后台运行的脚本,它可以拦截和处理网络请求,是实现离线缓存的关键。在网页的JavaScript代码中,可以使用以下方式注册:
      if ('serviceWorker' in navigator) {
             
        navigator.serviceWorker.register('service - worker.js')
          .then(function (registration) {
             
                console.log('Service Worker注册成功');
            })
          .catch(function (error) {
             
                console.log('Service Worker注册失败:', error);
            });
      }
      
    • 上述代码检查浏览器是否支持Service Worker,如果支持,则注册一个名为service - worker.js的Service Worker脚本。这个脚本将在后台运行,用于处理缓存相关的操作。
  2. 在Service Worker中缓存资源

    • service - worker.js文件中,需要使用CacheStorage来缓存资源。首先,在Service Worker的install事件中添加缓存逻辑。install事件在Service Worker安装时触发,是一个很好的时机来预先缓存一些关键资源。
      self.addEventListener('install', function (event) {
             
        event.waitUntil(
            caches.open('my - cache - name')
              .then(function (cache) {
             
                    return cache.addAll([
                        // 替换为你的实际资源路径
                        '/',
                        '/index.html',
                        '/styles.css',
                        '/script.js',
                        '/images/logo.png'
                    ]);
                })
        );
      });
      
    • 这里,caches.open('my - cache - name')打开一个名为my - cache - name的缓存,然后cache.addAll()方法将一组资源添加到缓存中。这些资源可以是HTML文件、CSS文件、JavaScript文件、图片等。需要注意的是,资源路径是相对于网站根目录的。
  3. 拦截网络请求并返回缓存内容

    • 在Service Worker的fetch事件中,可以拦截网页发出的网络请求,并尝试从缓存中返回内容。如果缓存中没有请求的资源,再从网络获取。
      self.addEventListener('fetch', function (event) {
             
        event.respondWith(
            caches.open('my - cache - name')
              .then(function (cache) {
             
                    return cache.match(event.request).then(function (response) {
             
                        if (response) {
             
                            return response;
                        }
                        return fetch(event.request).then(function (response) {
             
                            cache.put(event.request, response.clone());
                            return response;
                        });
                    });
                })
        );
      });
      
    • 上述代码首先尝试从缓存(my - cache - name)中查找与请求(event.request)匹配的响应。如果找到响应(response),则直接返回缓存中的内容。如果缓存中没有找到,就使用fetch方法从网络获取资源。获取到资源后,将资源放入缓存(cache.put()),这样下次请求相同资源时就可以直接从缓存中获取,最后返回从网络获取的资源。
  4. 更新缓存策略(可选)

    • 可以采用一些策略来更新缓存内容,以确保用户获取到最新的资源。一种简单的方法是在fetch事件中检查资源是否有更新,然后更新缓存。例如,可以通过检查响应头中的版本信息或者时间戳来判断。
      self.addEventListener('fetch', function (event) {
             
        event.respondWith(
            caches.open('my - cache - name')
              .then(function (cache) {
             
                    return cache.match(event.request).then(function (response) {
             
                        if (response) {
             
                            // 检查资源是否有更新,这里假设响应头中有version字段
                            const newResponse = await fetch(event.request);
                            const oldVersion = response.headers.get('version');
                            const newVersion = newResponse.headers.get('version');
                            if (newVersion > oldVersion) {
             
                                cache.put(event.request, newResponse.clone());
                                return newResponse;
                            } else {
             
                                return response;
                            }
                        }
                        return fetch(event.request).then(function (response) {
             
                            cache.put(event.request, response.clone());
                            return response;
                        });
                    });
                })
        );
      });
      
    • 这里假设响应头中有一个version字段用于表示资源的版本。当缓存中有资源,且从网络获取的新资源版本更高时,更新缓存并返回新资源;否则返回缓存中的旧资源。如果缓存中没有资源,就从网络获取并放入缓存。
相关文章
|
编解码 数据挖掘 Windows
Office 2021 for Windows 简体中文 官网下载地址
Microsoft Office 2021 Pro Plus专业增强版包括对Word、Excel、PowerPoint、Outlook、OneNote、Publisher、Access、Teams的更新。
1984 0
|
前端开发 JavaScript 开发者
掌握 CSS 弹性布局(Flexbox):构建复杂页面布局的高效秘籍与实战案例
CSS弹性布局(Flexbox)是现代网页设计中构建复杂页面布局的高效工具。本文将深入浅出地介绍Flexbox的核心概念、使用技巧及实际应用案例,帮助读者快速掌握这一强大布局方法。
|
缓存 Cloud Native 区块链
重塑链上数据索引,Chainbase 云原生 Subgraph 解析
Subgraph 是 The Graph 去中心化应用索引协议的具体实现, 能为各个智能合约创建索引引擎,提供 dataset 数据集供开发者快速查询使用。目前,Chainbase 正式上线并托管的核心 dataset subgraph 数量已经超过 100+。
883 0
重塑链上数据索引,Chainbase 云原生 Subgraph 解析
|
消息中间件 分布式计算 druid
大数据-154 Apache Druid 架构与原理详解 基础架构、架构演进
大数据-154 Apache Druid 架构与原理详解 基础架构、架构演进
331 2
|
计算机视觉
vs2019_qt6.2.4_dcmtk3.6.7_vtk9.2.2_itk5.3_opencv4.6.0编译记录
这篇文章记录了使用VS2019编译Qt6.2.4、DCMTK3.6.7、VTK9.2.2、ITK5.3和OpenCV4.6.0的过程,包括下载和编译步骤,并提供了遇到编译错误时的解决方案和参考链接。
391 0
vs2019_qt6.2.4_dcmtk3.6.7_vtk9.2.2_itk5.3_opencv4.6.0编译记录
|
机器学习/深度学习 编解码 人工智能
深度学习与CV教程(16) | 生成模型(PixelRNN,PixelCNN,VAE,GAN)
本文讲解了无监督学习(聚类、PCA、特征学习、密度估计)和三种常用生成模型的原理及优缺点:Pixel RNN / Pixel CNN、变分自编码器(VAE)、生成对抗网络(GAN)【对应 CS231n Lecture 13】
20077 1
 深度学习与CV教程(16) | 生成模型(PixelRNN,PixelCNN,VAE,GAN)
|
JavaScript 前端开发 API
JavaScript基础-事件监听与处理
【6月更文挑战第11天】本文介绍了JavaScript事件驱动编程的核心,包括事件流(捕获、目标、冒泡阶段)和监听方法(DOM Level 0、addEventListener/removeEventListener)。讨论了常见问题和易错点,如内存泄漏、事件委托和阻止默认行为的混淆,并提供了解决策略。通过代码示例展示了事件绑定、事件委托和阻止默认行为的用法,强调理解事件处理机制对于编写高效交互式Web应用的重要性。
911 6
|
安全 算法 数据安全/隐私保护
探索Android 12中的隐私保护新特性
【6月更文挑战第30天】随着数字时代的到来,个人数据安全和隐私保护日益成为用户关注的焦点。本文将深入探讨Android 12操作系统中引入的隐私保护功能,从全新的隐私仪表板到精细的应用权限管理,再到增强的系统安全性,我们将逐一分析这些新特性如何提升用户的隐私保护水平,并讨论它们对开发者和用户体验可能产生的影响。
|
人工智能 自然语言处理
通义听悟AI能力问题之通义听悟定义如何解决
通义听悟AI能力问题之通义听悟定义如何解决
530 0
|
存储 缓存 移动开发
详细介绍HTML5的离线储存(工作原理+使用场景+真实使用步骤)
详细介绍HTML5的离线储存(工作原理+使用场景+真实使用步骤)