如何使用 CacheStorage 实现离线缓存

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
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字段用于表示资源的版本。当缓存中有资源,且从网络获取的新资源版本更高时,更新缓存并返回新资源;否则返回缓存中的旧资源。如果缓存中没有资源,就从网络获取并放入缓存。
相关文章
|
6天前
|
人工智能 数据可视化 安全
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
本文详解如何用阿里云Lighthouse一键部署OpenClaw,结合飞书CLI等工具,让AI真正“动手”——自动群发、生成科研日报、整理知识库。核心理念:未来软件应为AI而生,CLI即AI的“手脚”,实现高效、安全、可控的智能自动化。
15040 10
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
|
17天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
26632 140
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
7天前
|
人工智能 JSON 监控
Claude Code 源码泄露:一份价值亿元的 AI 工程公开课
我以为顶级 AI 产品的护城河是模型。读完这 51.2 万行泄露的源码,我发现自己错了。
4558 20
|
5天前
|
人工智能 API 开发者
阿里云百炼 Coding Plan 售罄、Lite 停售、Pro 抢不到?最新解决方案
阿里云百炼Coding Plan Lite已停售,Pro版每日9:30限量抢购难度大。本文解析原因,并提供两大方案:①掌握技巧抢购Pro版;②直接使用百炼平台按量付费——新用户赠100万Tokens,支持Qwen3.5-Max等满血模型,灵活低成本。
1388 3
阿里云百炼 Coding Plan 售罄、Lite 停售、Pro 抢不到?最新解决方案