Service Worker 将 API 调用中的文件添加到预缓存中

2023-12-12

使我的应用程序能够离线运行。在安装过程中,服务人员应该:

  1. 从异步 API 获取 URL 列表
  2. 重新格式化响应
  3. 将响应中的所有 URL 添加到预缓存

对于此任务,我将 Google Workbox 与 Webpack 结合使用。

问题:虽然服务工作线程成功缓存了所有 Webpack 资源(这告诉我工作箱基本上完成了它应该做的事情),但它不会等待异步 API 调用来缓存其他远程资源。它们会被简单地忽略,既不会被缓存,也不会在网络中获取。

这是我的服务人员代码:

importScripts('https://storage.googleapis.com/workbox-cdn/releases/3.1.0/workbox-sw.js');

workbox.skipWaiting();
workbox.clientsClaim();
    
self.addEventListener('install', (event) => {
  const precacheController = new 
  workbox.precaching.PrecacheController();
  const preInstallUrl = 'https://www.myapiurl/Assets';
  event.waitUntil(fetch(preInstallUrl)
    .then(response => response.json()
    .then((Assets) => {
      Object.keys(Assets.data.Assets).forEach((key) => {
        precacheController.addToCacheList([Assets.data.Assets[key]]);
      });
    })
  );
});

self.__precacheManifest = [].concat(self.__precacheManifest || []);
workbox.precaching.suppressWarnings();
workbox.precaching.precacheAndRoute(self.__precacheManifest, {});
    
workbox.routing.registerRoute(/^.*\.(jpg|JPG|gif|GIF|png|PNG|eot|woff(2)?|ttf|svg)$/, workbox.strategies.cacheFirst({ cacheName: 'image-cache', plugins: [new workbox.cacheableResponse.Plugin({ statuses: [0, 200] }), new workbox.expiration.Plugin({ maxEntries: 600 })] }), 'GET');

这是我的工作箱 webpack 配置:

new InjectManifest({
  swDest: 'sw.js',
  swSrc: './src/sw.js',
  globPatterns: ['dist/*.{js,png,html,css,gif,GIF,PNG,JPG,jpeg,woff,woff2,ttf,svg,eot}'],
  maximumFileSizeToCacheInBytes: 5 * 1024 * 1024,
})

看起来您正在创建自己的PrecacheController实例并且还使用precacheAndRoute(),它们实际上并不打算一起使用(文档中没有很好地解释,仅在这一个地方).

问题在于辅助方法workbox.precaching.*实际上创建自己的PrecacheController引擎盖下的实例。既然你正在创建自己的PrecacheController实例和also呼叫workbox.precaching.precacheAndRoute([...]),你最终会得到两个PrecacheController不能一起工作的实例。

从您的代码示例来看,您似乎正在创建一个PrecacheController实例,因为您想加载文件列表以在运行时预缓存。没关系,但如果您打算这样做,则需要注意以下几点:

  • 您的软件可能不会更新Service Worker 更新通常在您调用时触发navigator.serviceWorker.register()并且浏览器检测到 Service Worker 文件已更改。这意味着如果你改变什么/Assets返回,但您的 Service Worker 文件的内容没有更改,您的 Service Worker 不会更新。这就是大多数人在 Service Worker 中硬编码预缓存列表的原因(因为对这些文件的任何更改都会触发新的 Service Worker 安装)。

  • 您必须手动添加自己的路线我之前提到过workbox.precaching.precacheAndRoute([...])创建自己的PrecacheController引擎盖下的实例。它也是添加自己的fetch手动监听响应请求。这意味着如果您不使用precacheAndRoute(),您必须创建自己的路由器并定义自己的路由。以下是有关如何创建路线的文档:https://developers.google.com/web/tools/workbox/modules/workbox-routing.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Service Worker 将 API 调用中的文件添加到预缓存中 的相关文章

  • 长时间等待向 Service Worker 发出请求

    我注意到 等待服务工作人员响应缓存中的项目的时间并不像您预期 的那么快 我发现两者的等待时间相同sw precache和一个定制的书面服务人员 造成此等待时间的可能原因是什么 如何减少它 My fetch自定义 Service Worker
  • 如何将网络通知内容复制到剪贴板

    我正在使用 Firebase Cloud Messaging FCM 发送数据消息 以便我可以使用 Service Worker 处理通知 现在 我使用 Service Worker 显示通知 当我单击通知时 我想将通知内容复制到剪贴板中
  • 服务工作线程不从缓存返回文件

    我正在尝试使用 Service Worker 缓存单页 Web 应用程序 它应该从缓存中获取所有文件 并仅在发布新的服务工作线程版本时更新该缓存 使用预缓存功能 我将一些文件写入缓存 如下所示 function precache retur
  • 错误:请求对象已被使用

    我不断在控制台日志中收到此错误 未捕获 承诺中 类型错误 无法在 ServiceWorkerGlobalScope 上执行 获取 无法使用已使用的请求对象构造请求 我尝试更改我的 Service Worker 但不起作用 self addE
  • React (CRA) Service Worker 缓存“公共”文件夹

    执行 create react app 并启用 Service Worker 后index js 来自的所有相关文件src文件夹被缓存 然而我的一些资源位于public目录 当我跑步时npm run build the asset mani
  • 承诺是否会被延迟评估?

    下面的代码是否保证输出HERE var p new Promise gt console log HERE 也就是说 var p new Promise fn 总是执行fn if p then 从未被要求对结果做某事 更具体地说 在服务人员
  • 如何制作一个按钮来打开我的网络应用程序的新实例?

    我制作了一个渐进式网络应用程序 可以从浏览器安装并离线工作 http taiwamaker netlify app 我想在主导航中创建一个按钮 单击该按钮将打开一个新的应用程序窗口 我不想在 chrome 选项卡中打开窗口 在我的计算机 l
  • 如何在React项目中添加Service Worker

    我想在我的 React 项目中添加 Service Worker 项目已准备就绪 默认服务似乎不起作用 即使当我尝试导入它时 它也会出现以下错误 尝试导入错误 registerServiceWorker 不包含默认导出 导入为 regist
  • 未捕获(承诺中)DOMException:超出配额

    我正在尝试查看离线状态演示 https serviceworke rs offline status demo html从下面的链接 我得到 DOMException 超出配额 https serviceworke rs offline s
  • 渐进式 Web 应用程序:离线缓存在 Android 上不起作用,但在 Chrome 开发工具上起作用

    我有一个简单的 PWA 可以在网上正常运行 我还在 Chrome 开发工具中测试了离线行为 并且 Service Worker 正在完美地完成其工作 但是 当我从 Android 手机运行该应用程序时 它无法离线工作 因为离线时缓存存储不再
  • 渐进式 Web 应用程序的预期启动体验是什么?

    测试渐进式 Web 应用程序 当我在飞行模式下启动应用程序时 我得到了意外的启动 启动体验 Android Chrome 从主屏幕体验启动 我看到一个白色的屏幕 然后是 离线恐龙 的短暂闪烁 然后应用程序成功启动 一切正常 启动时间比我预期
  • 尝试加载 --- 我的网站时,服务工作人员获取错误?

    我最近将 Cloudfront 添加到我的网络应用程序中 我正在使用 WorkBox 服务工作者并收到错误 VM7 workbox strategies prod js 1 未捕获 承诺 TypeError 无法获取 我发现从这个帖子 ht
  • 无法查看 Service Worker 日志

    看不到我的 Service Worker 的日志 以下是我尝试打开已注册和正在运行的服务工作人员日志的步骤 Open chrome serviceworker internals 单击开始并检查 刷新检查窗口 等待日志出现 但是 两者chr
  • 在 Android 移动设备上使用 Chrome 调试 Service Worker

    我正在开发一个渐进式 Web 应用程序 为了确保它可以在移动设备上运行 特别是在 Android 版 Chrome 上 因为它有 90 的用户 我正在尝试在 Android 设备上测试 Service Worker 不幸的是 在安卓版 Ch
  • Service Worker 创建的缓存存储在下线刷新页面后消失

    我正在尝试为我的网络应用程序实现离线功能 但离线时我遇到了一些奇怪的行为 这可能是我所缺少的 因为它在 Chrome 和 Firefox 中都可以重现 我将在下面描述什么示例应用程序 https github com mzenz vanis
  • 在client和serviceWorker之间传输数据

    我想尝试在 serviceWorker 中运行 websockets 我编写了注册serviceWorker的代码 if serviceWorker in navigator navigator serviceWorker register
  • 如何在 create-react-app 中以开发模式启用 Service Worker?

    我知道我们可以在生产模式下测试我们的 Service Worker 但是重新构建和部署的过程非常烦人 有什么方法可以在开发模式下启用服务工作者吗 改变这个 window addEventListener load gt const swUr
  • 使用 workbox-webpack-plugin 时,预缓存资源使用什么工作箱策略?

    我正在尝试了解工作箱和服务人员 使用workbox webpack plugin和GenerateSW模式时 用于预缓存资源的workbox策略是什么 IE 因为我似乎没有为预缓存资产设置路由 策略 以便服务工作线程更新这些资产的缓存 那么
  • 如何从扩展服务工作人员创建网络工作人员

    我将首先解释我想要实现的目标 我想创建一个扩展程序 可以在不同 chrome 窗口上的选项卡之间切换 并显示每个选项卡 X 时间 我发现了一个类似的扩展 但它是使用manifest V2完成的 并且不支持多个窗口 我想通过为每个窗口创建一个
  • 列出 chrome 注册的 Service Worker

    有没有办法列出所有注册服务人员的浏览器 假设我已经注册 安装了一些服务人员 我可以通过js获取文件名数组列表吗 显然我找到了两种适合我的方法 对于 Chrome 一种是使用快捷命令 chrome serviceworker internal

随机推荐

  • 如何将 CSV 文件直接发送到 FTP 服务器

    我的问题是如何将 CSV 文件发送到 FTP 服务器 如您所见 以下脚本是我当前的代码 代码示例 def download outage info all request upload data download data form req
  • WordPress 致命错误:第 1832 行的 wp-includes/wp-db.php 中允许的内存大小 536870912 字节已耗尽(尝试分配 77 字节)

    我最近注意到我的 WordPress 网站有时会收到 500 内部服务器错误 我检查了日志 有很多行 例如 2016 年 10 月 3 日星期一 01 25 24 357439 fcgid 警告 pid 12840 客户端 83 27 21
  • 在父 div 内对角排列 2 个 div

    我试图在父 div 内排列 2 个 div 这样看起来父 div 被对角线分成两部分 下图将显示需要什么 这是我尝试过的代码 App js import React Component from react import App css c
  • Cube on Cube 碰撞检测算法?

    我试图找到最有效的方法来检查两个任意大小的立方体是否相互碰撞 立方体的边长不一定都相等 盒子是可能的 考虑到这些限制 我如何有效地检查它们是否发生冲突 每个盒子有 24 个顶点 谢谢 它们是轴对齐的 由于两个框都是轴对齐的 因此您可以比较它
  • 升级到 VS2010 和 Re#5 后 SQLite 相关的 nUnit 测试出现问题

    使用 ReSharper5 转换为 Visual Studio 2010 后 我的一些单元测试开始失败 更具体地说 这适用于使用 NHibernate 和 SQLite 的所有单元测试 这个问题似乎与 SQLite 有关 不涉及NHiber
  • 如何在没有边框的表单周围添加阴影?

    我试图弄清楚如何使用 WinForms 在无边框表单周围添加完整的阴影 我正在考虑在表格的四个侧面周围添加阴影 我尝试过使用 DropShadow 类 尽管它只将阴影添加到底角和右侧角 我之前在搜索中多次看到这个问题被问到 但我发现没有任何
  • 如何仅在线性布局的一侧绘制边框?

    我能够将边框绘制到线性布局 但它是在所有侧面绘制的 我想将其限制为仅在右侧 就像在 CSS 中所做的那样 border right 1px Solid red 我已经尝试过这个 但它仍然吸引各方
  • CSS 变量在 Microsoft Edge 中的工作方式是否有所不同?

    我正在开发一个网站 并针对 Firefox 和 Chrome 对其进行了优化 该项目包含一个名为base css它包含在所有页面中 并且包含一些全局设置和定义 包括我用来存储颜色值的变量列表 如下所示 root yellow 1 fff8e
  • Internet Explorer 的永恒重新加载页面

    我在 Internet Explorer 7 上使用 FB 应用程序时遇到问题 我正在使用FB前一段时间提供的这段代码 auth url http www facebook com dialog oauth client id FACEBO
  • 指令集架构的定义是什么?

    我试图弄清楚指令集架构 ISA 到底是什么 根据我所读到的内容 我有两种解释 我的第一个解释是 ISA 是所有寄存器 汇编指令和伪指令 汇编指令以及构成汇编语言的指令格式的集合 可用于对实现指令集的处理器进行编程 我的第二种解释是 ISA
  • 清除 C# 表单上所有控件的最佳方法是什么?

    我记得不久前看到有人问过类似的问题 但我进行了搜索 但找不到任何东西 我试图想出最干净的方法来将表单上的所有控件清除回默认值 例如 清除文本框 取消选中复选框 你会怎么做呢 到目前为止我想出的是这样的 public static class
  • C 宏的作用域规则

    我不是一个 C 程序员 但我假设 C 宏几乎是一种查找和替换功能 其中预处理器获取宏定义并将其放在它看到宏名称的任何位置 这是 Dragon Book 的动态范围规则及其如何应用于宏的示例 define a x 1 int x 2 void
  • 在 null Laravel 5.4 上调用成员函数 connection()

    尝试编写一个单元测试 我需要执行 sql 查询 class UpdateThrowsTest extends TestCase protected bgame protected game id 95 public function set
  • 是否可以声明升序列表?

    我可以像这样制作升序整数列表 findall L between 1 5 L List 我知道我还可以使用以下方法生成值 length X 但我不认为我可以在 findall 中使用它 就像下面的循环一样 findall X length
  • 为什么 BackgroundWorker 不需要在 ProgressChanged 事件处理程序中调用?

    自从ProgressChanged事件处理程序是从某个地方引发的DoWork事件处理程序 不应该在异步操作线程上调用它们吗 DoWork也运行在 UI 线程上 而不是 UI 线程上 因此需要 Invoke 或BeginInvoke操纵控制
  • 为什么 kubernetes 需要有 2 个 coredns pod

    我安装了新的 kubernetes 单节点集群 并且看到 2 个 coredns pod 正在运行 其中一个失败了 不是这个问题的一部分 为什么他们是2个 有关 CoreDNS 的详细调整信息link CoreDNS 内存使用情况主要受集群
  • Python:找不到 os.listdir 文件[重复]

    这个问题在这里已经有答案了 我最近将配置文件移动到项目中的另一个文件夹 我尝试像这样加载 CONFIG PATH os path abspath os path dirname os path abspath file config def
  • for循环后全局变量的值不会改变

    我正在开发一个hadoop项目 我想找到某一天的客户 然后写出当天消费最多的客户 在我的减速器类中 由于某种原因 全局变量maxfor 循环后不会改变它的值 EDIT我想找到某一天消费最多的顾客 我已经设法在我想要的日期找到客户 但我在减速
  • 如何将第 3 方 JAR 添加到 jGRASP 中的编译时类路径?

    我需要做什么才能成功导入ij包裹 我收到错误 ITCN java 1 package ij does not exist 进口产品为 import ij import ij io import ij gui import ij proces
  • Service Worker 将 API 调用中的文件添加到预缓存中

    使我的应用程序能够离线运行 在安装过程中 服务人员应该 从异步 API 获取 URL 列表 重新格式化响应 将响应中的所有 URL 添加到预缓存 对于此任务 我将 Google Workbox 与 Webpack 结合使用 问题 虽然服务工