如何使用 CacheStorage 实现离线缓存

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 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字段用于表示资源的版本。当缓存中有资源,且从网络获取的新资源版本更高时,更新缓存并返回新资源;否则返回缓存中的旧资源。如果缓存中没有资源,就从网络获取并放入缓存。
相关文章
|
7月前
|
缓存 iOS开发
IOS网络编程:使用 URLSession 实现网络请求的步骤是什么?
IOS网络编程:使用 URLSession 实现网络请求的步骤是什么?
126 1
|
2月前
|
存储 前端开发 JavaScript
WEB前端开发中如何实现大文件上传?
WEB前端开发中如何实现大文件上传?
238 3
WEB前端开发中如何实现大文件上传?
|
3月前
|
XML 前端开发 PHP
如何使用 DomCrawler 进行复杂的网页数据抓取?
如何使用 DomCrawler 进行复杂的网页数据抓取?
|
6月前
|
数据采集 JSON 数据格式
三:《智慧的网络爬虫》— 网络请求模块(下)
本篇文章讲解了网络请求模块中Requests模块的get请求和post请求,并用十几张图示详细介绍了爬虫工具库与开发者工具的操作与使用;同时本篇文章也列举了多个代码示例如:对搜狗网页的爬取;爬取360翻译(中英文互译程序)并以此介绍了重放请求(通过重放请求来确定反爬参数)以及Cookie与Session实战案例 -- 爬取12306查票
76 9
三:《智慧的网络爬虫》—  网络请求模块(下)
|
6月前
|
数据采集 数据安全/隐私保护 Python
二:《智慧的网络爬虫》— 网络请求模块(上)
网络请求模块就是帮助浏览器(客户端)向服务器发送请求的​。在Python3之前的版本(Python2版本)中所使用的网络请求模块是urllib模块​;在Python3现在的版本中通过urllib模块进行升级 有了现在所使用的requests模块,也就是requests模块是基于urllib模块进行开发的。本篇文章讲解的是urllib模块。
68 2
二:《智慧的网络爬虫》—  网络请求模块(上)
|
7月前
|
存储 Web App开发 缓存
PWA进阶:离线存储与推送通知的高级技巧
PWA利用Service Worker实现离线存储和智能缓存策略,提供类似原生应用的体验。它能展示离线页面、处理错误,并请求用户授权推送通知。个性化通知结合富媒体内容,允许用户互动并管理退订。通过合理推送策略和工具进行测试与调试,优化用户体验。
116 2
|
小程序 API 开发者
【小程序全面解析】生命周期、常用组件,代码示例和使用场景
该文章全面介绍了小程序的生命周期、常用基础组件以及使用场景,并提供了相应的代码示例。读者可以了解小程序的生命周期函数及其执行时机,以及学习如何使用常用基础组件构建小程序页面。此外,文章还列举了各种使用场景,帮助读者更好地理解如何应用小程序开发。如果您是小程序开发的初学者或需要了解小程序的基础知识,该文章将为您提供全面的帮助和指导。
399 0
【小程序全面解析】生命周期、常用组件,代码示例和使用场景
|
7月前
|
存储 缓存 移动开发
html实现离线缓存(工作原理+怎么使用+应用场景)
html实现离线缓存(工作原理+怎么使用+应用场景)
134 0
|
存储 NoSQL 算法
文件上传下载系列——如何实现文件秒传
文件上传下载系列——如何实现文件秒传
|
前端开发 JavaScript 安全
带你读《现代Javascript高级教程》二十一、前端跨页面通信:实现页面间的数据传递与交互(1)
带你读《现代Javascript高级教程》二十一、前端跨页面通信:实现页面间的数据传递与交互(1)
165 0