当前位置: 首页 > 知识库问答 >
问题:

如何处理与服务工作者index.html文件的缓存?

袁运良
2023-03-14

我目前正在使用create-react-appdefault-service-worker开发一个渐进式web应用程序。

我在发布一个新版本的javascript块时遇到了破坏缓存的问题。

构建时,输出javascript文件使用contenthash来确保当JS文件中的内容发生变化时,文件名也会发生变化。在没有服务工作程序的情况下运行时,这会成功地关闭缓存。

但是,当使用create react appservice worker时,所有静态资产包括我的索引。html文件被缓存。这意味着旧的索引。html正在向用户提供,其中包括一个

我已弹出并修改了该网页包。配置。jsWorkboxWebpackPlugin以排除我的索引。html文件:

 new WorkboxWebpackPlugin.GenerateSW({
      clientsClaim: true,
      exclude: [/\.map$/, /asset-manifest\.json$/, /index.html/],
      importWorkboxFrom: "cdn",
      navigateFallbackBlacklist: [
          // Exclude URLs starting with /_, as they're likely an API call
             new RegExp("^/_"),
          // Exclude URLs containing a dot, as they're likely a resource in
          // public/ and not a SPA route
            new RegExp("/[^/]+\\.[^/]+$")
          ]
        }),

这似乎适当地停止了索引文件的缓存,允许它包含更新的main。[contenthash]。js在其脚本标记中。但是,现在我知道我的PWA不会作为索引脱机工作。html文件不由服务人员提供,也不会从脱机连接提供。

处理这件事最好的方法是什么?完全离线访问不是必需的,但拥有它会很好,我想知道其他开发人员是如何处理他们索引文件的服务工作者缓存的“破坏”,而不完全删除服务工作者缓存中的index.html?有没有更实用的方法来处理index.html中关于带有内容哈希的标签的这种变化?

非常感谢。


共有3个答案

罗鸿畴
2023-03-14

服务工作者仅在生产环境中启用,例如npm运行构建的输出。建议不要在开发环境中启用脱机first service worker,因为如果使用以前缓存的资产,并且不包括您在本地所做的最新更改,可能会导致失败。

从-https://create-react-app.dev/docs/making-a-progressive-web-app/

屈博
2023-03-14

一种方法是使用“回退到缓存”缓存策略。基本上,当请求文档(例如index.html文件)时,您首先尝试通过转发获取请求从网络加载它。但是,如果提取请求失败(网络不可用),您将从缓存中为请求提供服务。您还需要更新索引的缓存副本。html当然,每个请求都要保存到新的副本中。

这样,如果网络可用,您将始终获得索引的新版本。html,否则,将从缓存中提供已知的最新版本。

公良浩邈
2023-03-14

我在一个应用程序外壳架构上工作,其中服务人员缓存应用程序外壳,并为后续请求返回它。为了破坏缓存,我还对appshell进行了版本化,比如appshell-[hash]。因此,下一次当散列更改时,服务人员将缓存并提供新的应用程序外壳,丢弃旧的应用程序外壳。

 类似资料:
  • 因此,我有一个带有服务工作者的HTML页面,服务工作者缓存索引。html和我的JS文件。 问题是当我更改JS时,更改不会直接显示在客户端浏览器上。当然,在chrome开发工具中,我可以禁用缓存。但是在Chrome Mobile,我该怎么做呢? 我试图访问站点设置并点击CLEAR%RESET按钮。但它仍然从缓存加载旧页面/加载。我试图使用其他浏览器或铬隐姓埋名,它加载新的页面。 然后,我尝试清除我的

  • 我使用带有sw工具箱库的service worker。我的PWA缓存除API查询(图像、css、js、html)之外的所有内容。但是如果有一天某些文件会被更改呢。或者如果服务人员。js将被更改。应用程序应该如何知道文件中的更改? 我的服务人员。js: 我不知道在PWA中更新缓存的常用方法是什么。也许PWA应该在后台发送AJAX请求并检查UI版本?

  • 我正在使用Service Worker创建一个渐进式Web应用程序,我正在使用Service Worker工具箱来缓存我的内容。Service Worker代码来缓存我的内容: 代码运行正常,因为我在控制台上没有看到任何错误。但是我如何检查是否从云前或上面配置的网址的图像正在缓存和从缓存本身渲染。

  • 我正在侦听服务工作者中的获取事件,想知道何时缓存对获取的响应? 1)当Fetch事件被触发时?PreventDefault()停止它?2)我是否需要缓存:无存储在我的INIT参数到我的FETCH调用?3)它发生在event.respondwith()时间吗? 我有一个数据交付策略,寻求交付尽可能新鲜的数据,只有在网络很慢的情况下才去缓存。但即使如此,只要缓存完成,网络抓取仍然运行以更新缓存。 如果

  • 我有一个基于service worker的离线应用程序,允许用户离线下载pdf文件。 有一个文本文件,其中包含pdf文件的下载路径和特定格式的文件标题(以及css、js和图像路径),应用程序通过ajax读取此文本文件并绘制所有可用pdf文件的列表(通过显示标题和下载链接) 在安装过程中,工作人员读取相同的文件,并将所有pdf文件与文本文件一起放入缓存中,以便这些文件可以离线访问。 当我用一些新的p

  • 我们在reactjs应用程序中安装了离线插件,该应用程序使用service worker缓存构建文件,未检查新构建的任何更新,因此,具有旧构建的用户仍在使用service worker中的缓存数据访问旧站点。这些文件没有过期设置,所以我想知道是否有任何解决方案可以强制用户刷新页面或将更新推给用户? 我在新版本中进行了更新,没有缓存头,离线插件自动更新,但我仍然无法找到将此更新推送到旧用户文件的方法