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

如何在PWA中更新服务工作者缓存?

叶衡虑
2023-03-14

我使用带有sw工具箱库的service worker。我的PWA缓存除API查询(图像、css、js、html)之外的所有内容。但是如果有一天某些文件会被更改呢。或者如果服务人员。js将被更改。应用程序应该如何知道文件中的更改?

我的服务人员。js:

'use strict';
importScripts('./build/sw-toolbox.js');

self.toolbox.options.cache = {
  name: 'ionic-cache'
};

// pre-cache our key assets
self.toolbox.precache(
  [
    './build/main.js',
    './build/main.css',
    './build/polyfills.js',
    'index.html',
    'manifest.json'
  ]
);

// dynamically cache any other local assets
self.toolbox.router.any('/*', self.toolbox.cacheFirst);

// for any other requests go to the network, cache,
// and then only use that cached resource if your user goes offline
self.toolbox.router.default = self.toolbox.networkFirst;

我不知道在PWA中更新缓存的常用方法是什么。也许PWA应该在后台发送AJAX请求并检查UI版本?

共有3个答案

宇文峰
2023-03-14

我在不使用任何库的情况下与服务工作者打交道,我最终提出的解决方案涉及一些服务器端代码和一些客户端。简而言之,策略

首先,您需要的变量和位置:

  1. 在服务器端有一个服务工作者版本变量(如果您正在使用像php这样的东西,它将立即在服务器端更新而不需要重新部署,请将其放入数据库或配置文件中。我们叫它serverSWVersion
  2. 在你缓存的一个javascript文件上(我有一个专用于此的javascript文件)有一个全局变量,它也将是“服务工作者版本”。我们叫它clientSWVersion

现在如何使用这两个:

>

如果值不同,这意味着您的Web应用版本不是最新的。

如果是这种情况,则取消注册Service Worker并刷新页面,以便重新注册Service Worker并缓存新文件。

当新文件可用时,实际要做什么

>

当一个人再次访问时,服务工作者应该重新注册,所有缓存的文件都将被检索。

我提供了一个基于php服务器端的代码,我在实现此策略时使用了该代码。它应该向你展示原则。只需将“Exercise”文件夹放到php服务器的htdocs中,它就可以工作,而无需执行任何其他操作。我希望你觉得它有用。。。请记住,如果您使用的是其他服务器而不是php,则可以使用数据库而不是配置文件来存储服务器端service worker变量:

Zip文件,代码为:ServiceWorkerExercise。拉链

黄弘新
2023-03-14

这里有一个很好的解决方案,他说(简而言之)要么不使用缓存优先策略,要么更新显示“为最新更新重新加载”的UX模式

牟辰龙
2023-03-14

AFAIKsw_toolbox没有网络更新的缓存策略。我想这真的是你想要的。你想修改缓存-网络竞争策略-

 类似资料:
  • 我试图安装一个简单的ServiceWorker,但旧的,Django Web应用程序。我开始使用Chrome团队的示例读取缓存示例 这很好,但并不理想,因为如果需要,我想更新缓存。根据阅读此处所有其他服务人员的答案,有两种推荐方法。 > 使用一些服务器端逻辑来知道您显示的内容何时更新,然后更新您的服务辅助角色以更改所述内容。例如,这就是sw-preache所做的。 只要在需要更新资源时更新serv

  • 我正在使用“缓存”将我的PWA资产缓存到service worker中,并使其脱机可用。 当我改变一个资产,特别是一个js文件,我修改至少一个字节在我的服务工作人员触发其本机更新:服务工作人员更新和检索所有以前缓存的资产,以刷新其缓存。 然而,服务器以文件的缓存版本响应,尽管我拥有所服务的文件,但我无法控制缓存控制http头。 如何防止在服务工作者缓存的资源上进行浏览器缓存?使用 后缀将不起作用,

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

  • 我使用sw-precache生成Polymer-CLI构建过程中的服务工作,因此它旨在更新更新文件的散列,以表示需要更新缓存。但是缓存中没有替换我更新的内容,因此如果我使用ctrl-r刷新,它将获得旧版本,但如果使用ctrl-shift-r刷新,它将获得新版本。原因可能是我的服务人员没有更新。 这份文件说 如果与当前相比,服务辅助程序文件中甚至有一个字节的差异,它就认为它是新的。 ,但如果我的新服

  • 我将React应用程序转换为PWA,它的工作部分正常。 我遵循了本教程:https://medium.com/@toricpope/transform-a-react-app-to-a-progressive-web-app-pwa-dea336bd96e6 然而,本文只展示了如何缓存静态数据,我还需要存储来自服务器的数据,我可以按照本文第一个答案的说明来做:如何将API中的数据缓存到React

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