如何使用 CacheStorage 实现离线缓存

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 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字段用于表示资源的版本。当缓存中有资源,且从网络获取的新资源版本更高时,更新缓存并返回新资源;否则返回缓存中的旧资源。如果缓存中没有资源,就从网络获取并放入缓存。
相关文章
|
前端开发 JavaScript 开发者
掌握 CSS 弹性布局(Flexbox):构建复杂页面布局的高效秘籍与实战案例
CSS弹性布局(Flexbox)是现代网页设计中构建复杂页面布局的高效工具。本文将深入浅出地介绍Flexbox的核心概念、使用技巧及实际应用案例,帮助读者快速掌握这一强大布局方法。
淘宝API接口( item_detail - 淘宝商品详情查询)
淘宝商品详情查询 API(item_detail)用于获取淘宝商品的详细信息。请求参数包括商品唯一 ID(num_iid)和是否获取促销价(is_promotion)。响应参数包含商品标题、价格、库存、图片链接、品牌等详细信息。
|
机器学习/深度学习 编解码 人工智能
深度学习与CV教程(16) | 生成模型(PixelRNN,PixelCNN,VAE,GAN)
本文讲解了无监督学习(聚类、PCA、特征学习、密度估计)和三种常用生成模型的原理及优缺点:Pixel RNN / Pixel CNN、变分自编码器(VAE)、生成对抗网络(GAN)【对应 CS231n Lecture 13】
20101 1
 深度学习与CV教程(16) | 生成模型(PixelRNN,PixelCNN,VAE,GAN)
|
人工智能 PyTorch TensorFlow
分布式训练:大规模AI模型的实践与挑战
【7月更文第29天】随着人工智能的发展,深度学习模型变得越来越复杂,数据集也越来越大。为了应对这种规模的增长,分布式训练成为了训练大规模AI模型的关键技术。本文将介绍分布式训练的基本概念、常用框架(如TensorFlow和PyTorch)、最佳实践以及可能遇到的性能瓶颈和解决方案。
1867 2
|
JavaScript 前端开发 API
JavaScript基础-事件监听与处理
【6月更文挑战第11天】本文介绍了JavaScript事件驱动编程的核心,包括事件流(捕获、目标、冒泡阶段)和监听方法(DOM Level 0、addEventListener/removeEventListener)。讨论了常见问题和易错点,如内存泄漏、事件委托和阻止默认行为的混淆,并提供了解决策略。通过代码示例展示了事件绑定、事件委托和阻止默认行为的用法,强调理解事件处理机制对于编写高效交互式Web应用的重要性。
936 6
|
Kubernetes 网络性能优化 调度
在K8S中,Kubernets资源限制是如何配置的,是否根据Qos?
在K8S中,Kubernets资源限制是如何配置的,是否根据Qos?
|
存储 缓存 移动开发
详细介绍HTML5的离线储存(工作原理+使用场景+真实使用步骤)
详细介绍HTML5的离线储存(工作原理+使用场景+真实使用步骤)
|
存储 并行计算 算法
基础的点云转换
对于点云处理而言,最简单也逃不过的就是点云转换了,我们就从点云转换开始,来一步步完成点云加速的学习。点云基础转换是3D点云处理中的一个重要步骤。它的主要目的是将点云从一个坐标系转换到另一个坐标系中,通常是为了方便后续处理或者显示。在实际应用中,点云基础转换通常包括平移、旋转、缩放等操作。这里对应了pcl::transformPointCloud这种方法 1. CUDA与Thrust 使用CUDA和Thrust进行点云基础转换可以大大提高处理效率,特别是当点云数据量较大时。CUDA是一种并行计算架构,可以利用GPU的计算能力来加速计算,而Thrust是CUDA的C++模板库,提供了许多与ST
530 0
|
前端开发 JavaScript 开发者
【前端革新力】React与CSS-in-JS完美邂逅:从styled-components到emotion,全面解析样式管理新趋势的实战应用与优势剖析!
【8月更文挑战第31天】CSS-in-JS 作为一种新兴的样式管理方式,近年来在前端社区受到广泛关注。它将样式嵌入 JavaScript,实现了样式与逻辑的高度耦合,提升了开发效率并解决了全局样式污染等问题。本文通过具体代码示例,探讨 CSS-in-JS 在 React 开发中的应用,并分享实践心得。首先介绍了 CSS-in-JS 的基本概念,然后详细展示了如何使用 styled-components 和 emotion 这两个流行库创建样式化组件。
760 0
|
JavaScript Java 测试技术
基于springboot+vue.js的宠物商城网站附带文章和源代码设计说明文档ppt
基于springboot+vue.js的宠物商城网站附带文章和源代码设计说明文档ppt
284 1