服务工作者过期

12
一旦Service Worker安装完成,Chrome浏览器需要多久检查更新版本?当前客户端Service Worker通常何时过期?
我试图找出使用Service Worker并将更改推送到生产环境的最佳实践。当前问题是,一旦对Service Worker的行为进行更改,如果之前已经安装了Service Worker,则客户端不总是会采用新更改。
这个问题也与此有关:Programmatically update service worker - 理想情况下,您希望在所有可能已经拥有先前版本的客户端上强制更新SW一次更改被实现。
3个回答

9

默认情况下,Service Worker在24小时后过期。但最好的方法是使用max-age = 0头信息,因为我们希望更改尽快反映出来。我不知道如何进行强制更新,但是当服务工作者文件没有缓存且没有任何选项卡打开以前的服务工作者时,新的服务工作者将会自动安装。

请参考此链接获取更多信息 https://jakearchibald.com/2016/caching-best-practices/


请参考以下链接:https://dev59.com/kFkT5IYBdhLWcg3wRNYR#38854905 - sideshowbarker
4
能否详细说明它的过期时间?我只找到它会在大约24小时后尝试自我更新,但没有发现如果不使用它或其他情况下会过期。我猜想仅当服务器在24小时后没有响应新的服务工作者请求时(即尝试自我更新后),它才会自行过期。 - Luc

7
仔细阅读所提供的MDN文档可以得出答案:
如果您的服务工作者以前已安装,但在刷新或页面加载时有新版本的工作者可用,则新版本将在后台安装,但尚未激活。只有在没有加载任何仍在使用旧服务工作者的页面时才会激活它。一旦没有加载任何这样的页面,新的服务工作者就会被激活。
参考链接:https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#Updating_your_service_worker

1
我一直在Chrome电脑和Chrome Android手机上测试Service Worker。
结果是:
- 一个是Service Worker及其状态。 - 另一个是在生产服务器上更新文件(如html、js等)时的典型缓存问题。
首先,我感到困惑,因为我认为Service Worker + 缓存问题的混合只会造成一团糟。
我发现,如果我更改.js文件,浏览器不会捕获它。所以我解决的方法是在脚本调用中使用版本号。
<script src="jquery-functions.js?ver=1.54"></script>

每次更改文件内的代码时,请确保增加版本号(在我的情况下为:ver=1.55)。
这只适用于计算机和Android,并且Server Worker不会干扰。它在Web版本和WebApp版本中的工作方式完全相同。
另一个问题是如何更改或更新服务工作者本身。 我尝试的第一件事是删除对服务工作者文件的脚本调用。这并没有删除服务工作者。
我寻找了删除服务工作者的代码,这似乎在Chrome计算机和Chrome for Android上正常工作。
// REMOVE ALL SERVICE WORKERS
navigator.serviceWorker.getRegistrations().then(
    function(registrations) {
        for(let registration of registrations) {
            registration.unregister();
        }
});

// AND REMOVE ALL CACHES 
caches.keys().then(function(names) {
    for (let name of names)
        caches.delete(name);
});

在计算机上: 如果没有使用服务工作者脚本应用此代码,则仍会运行,但出现此控制台消息:domain.name - deleted。 重新加载后,服务工作者的状态显示为“#状态冗余”。(这似乎没问题;服务工作者已被删除)
如果我再次运行服务工作者,并在Chrome控制台上向下滚动,就可以看到另一个服务工作者正在运行;因此,它似乎正常工作;这是杀死服务工作者和唤醒服务工作者的方法。
在Android手机上启动webApp主屏幕图标时: 第一次打开时与往常一样:服务工作者似乎继续正常工作。(行为与Chrome电脑相同)
第二次尝试使用“飞行模式”打开webApp主屏幕图标(以测试服务工作者的功能)时,如果没有互联网连接,将收到导航器的典型错误。我认为这种行为是正确的,因为服务工作者已被关闭。
我认为这是对服务工作者感到有点自信的第一步,但如果您有更多信息或测试,请发送反馈。
重要的是您使用Chrome控制台并选择“应用程序”->“服务工作者”的选项卡,这样您就可以看到后面发生了什么。
作为一个小小的奖励,当用户没有互联网连接时,通知用户无法保存更改是很好的。这是我所做的简单方法:
setInterval(() => {
    if (!navigator.onLine) { niceAlert("No Internet connection detected. Your changes will not be saved"); }
},5000);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接