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

服务工作者和透明缓存更新

子车飞鹏
2023-03-14

我试图安装一个简单的ServiceWorker,但旧的,Django Web应用程序。我开始使用Chrome团队的示例读取缓存示例

这很好,但并不理想,因为如果需要,我想更新缓存。根据阅读此处所有其他服务人员的答案,有两种推荐方法。

>

  • 使用一些服务器端逻辑来知道您显示的内容何时更新,然后更新您的服务辅助角色以更改所述内容。例如,这就是sw-preache所做的。

    只要在需要更新资源时更新service worker JS文件中的缓存版本(请参阅上面缓存示例中JS文件中的注释)。

    对我来说,两者都不是很好的解决方案。首先,这是一个愚蠢的传统应用程序。我没有sw precache所依赖的应用程序堆栈。其次,其他人更新将显示的数据(基本上是一个带有详细信息页面的列表)。

    我想尝试一下Jake Archibald在他的离线食谱中建议的“使用缓存,但从网络更新缓存”,但我不能完全让它工作。

    我最初的想法是,我应该能够在我的服务工作者中返回缓存的版本,但是队列一个函数,如果网络可用,该函数将更新缓存。例如,在读取事件侦听器中类似于此的内容

    // If there is an entry in cache, return it after queueing an update
    console.log(' Found response in cache:', response);
    setTimeout(function(request, cache){
        fetch(request).then(function(response){
            if (response.status < 400 && response.type == 'basic') {
                console.log("putting a new response into cache");
                cache.put(request, response);
            }   
        })  
    },10, request.clone(), cache);
    
    return response;
    

    但这不起作用。页面在加载时卡住。

    上面的代码有什么问题?达到目标设计的正确方法是什么?

  • 共有2个答案

    丌官盛
    2023-03-14

    在页面重新加载时,您可以使用新版本刷新您的服务人员,同时旧版本将处理请求。

    一旦一切都完成了,并且没有页面使用旧的service worker,它将使用更新版本的service worker。

    this.addEventListener('fetch', function(event){
        event.responseWith(
            caches.match(event.request).then(function(response){
                return response || fetch(event.request).then(function(resp){
                    return caches.open('v1').then(function(cache){
                        cache.put(event.request, resp.clone());
                        return resp;
                    })
                }).catch(function() {
                    return caches.match('/sw/images/myLittleVader.jpg');
                });
            })
        )
    });
    

    我建议您通过以下链接了解详细功能

    https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers

    任绪
    2023-03-14

    听起来像https://jakearchibald.com/2014/offline-cookbook/#stale-虽然重新验证非常接近您要查找的内容

    self.addEventListener('fetch', function(event) {
      event.respondWith(
        caches.open('mysite-dynamic').then(function(cache) {
          return cache.match(event.request).then(function(response) {
            var fetchPromise = fetch(event.request).then(function(networkResponse) {
              // if we got a response from the cache, update the cache
              if (response) {
                cache.put(event.request, networkResponse.clone());
              }
              return networkResponse;
            });
    
            // respond from the cache, or the network
            return response || fetchPromise;
          });
        })
      );
    });
    
     类似资料:
    • 我使用带有sw工具箱库的service worker。我的PWA缓存除API查询(图像、css、js、html)之外的所有内容。但是如果有一天某些文件会被更改呢。或者如果服务人员。js将被更改。应用程序应该如何知道文件中的更改? 我的服务人员。js: 我不知道在PWA中更新缓存的常用方法是什么。也许PWA应该在后台发送AJAX请求并检查UI版本?

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

    • 我有一个使用服务人员和缓存API的应用程序。Service Worker中使用的缓存名称包含GIT修订版(哈希),因此每次发布时,都会使用新缓存,删除旧缓存。这是为了百分之百地确保用户总是能够获得最新的源代码(这种情况对于预期的发布计划来说很好)。 我使用的是每天运行几次的Selenium Java(WebDriver)测试(比如GIT repo发生变化时),我希望确保每个新的GIT版本都能正确地

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

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

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