码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • PWA 踩坑 - 第一次加载页面后无法获取CacheStorage某些资源


    第一次加载Service Worker后,脱机再刷新,无法获取CacheStorage某些缓存的资源

    对于很多网上的例子,监听fetch,并使用:caches.match获取缓存数据时

    1. self.addEventListener('fetch', function (e) {
    2. e.respondWith(
    3. caches.match(e.request).then(res => {
    4. ...

    在第一次挂载service worker时,我们使用cache.addAll()来将cacheList中指定路径的资源转移到缓存中。

    1. const cacheList = ['./index.html',...]
    2. self.addEventListener('install', e => {
    3. e.waitUntil(
    4. caches.open(cacheName)
    5. .then(cache => {
    6. return cache.addAll(cacheList);
    7. })
    8. .then(() => self.skipWaiting()),
    9. );
    10. });

    问题与步骤

    1. 手动清除Service Worker,及caches缓存。
    2. 第一次加载页面后,马上脱机,然后再刷新。
    3. caches.match(e.request) ,一些特殊的资源会返回undefined,也就是找不到。
    4. 控制台查看缓存是有数据的。
    5. 联网状态下,刷新一次后,再脱机,则缓存资源能正常获取。
      这个可以理解,因为这次刷新是在Service Worker生效的条件下。 那么网页中的资源请求都会被Service Worker 的fetch事件拦截,并以e.request 为key添加到cache缓存中。

    调查

    获取缓存失败的资源的特征:

    • html 页面中 type="module" >的资源
    • css 中通过@font-face 引入的字体文件(.ttf) (验证了background:url引入的图片没有问题)

    因此初步得出结论:

    以上形式的资源,不能通过caches.match(Response) 的形式获取——由cache.addAll(cacheList) 缓存的数据

    解决方案

    caches.match(e.request.url),传入静态资源的url,可正常获取缓存数据。

    猜测原因

    可能是与这些资源第一次缓存时,存入的CacheStorage的 key不匹配导致的。

    因为第一次进入的缓存是通过 cache.addAll 缓存,其缓存到cache的key为何值不清楚,导致二次脱机刷新时获取不到资源。而实际上已经有缓存。

    截至写这篇文章时(2022-07-27)时,MDN(CacheStorage)上依旧为实验性。

    根据CacheStorage.match(request, options) MDN 文档,其方法有第二个参数,options,它可以一定程度控制match的匹配规则。
    从options.ignoreSearch 看出,匹配规则中会判断同一个url的参数是否相同。(这并不是原因)

    未实际查明原因。

    样本较少,若有错误或补充,敬请指出更正。

  • 相关阅读:
    Hive(15):Hive调优之建表优化
    pip安装pytorch报错
    场景分类任务可用数据集(部分)
    11.外观模式
    百题千解计划【CSDN每日一练】“编码”:编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码,把一些有规律的单词编成数字...实现方式:Python、C++、Java、JS...
    easyHttp -- 轻量级的 HTTP 客户端工具包
    【一起学Rust · 项目实战】命令行IO项目minigrep——接收命令行参数与读取文件内容
    10_ue4进阶_添加倒地和施法动作
    【Python】Hospital ward dynamic contact network网络数据集图信息提取
    Linux的文件权限管理
  • 原文地址:https://blog.csdn.net/qq_35459724/article/details/126023722
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号