我想在这里扩展其他一些答案,并从“将服务人员部署到生产中以确保我可以进行任何必要的更改时使用什么策略”的角度来解决这个问题?这些更改可能包括修复您在生产中发现的所有小错误,或者可能(但希望不会)包括由于无法克服的错误(所谓的“杀死开关”)而中和服务工作者。
出于此答案的目的,我们假设您致电
navigator.serviceWorker.register('service-worker.js');
在您的页面上,这意味着您的服务工作者JavaScript资源为service-worker.js
。(如果不确定是否使用了确切的服务工作者URL,请参阅下文,可能是因为您向服务工作者脚本中添加了哈希或版本信息。)
问题归结为如何解决service-worker.js
代码中的初始问题。如果它是一个小错误修复程序,那么您显然可以进行更改并将其重新部署service-worker.js
到托管环境。如果没有明显的错误修复,并且您不想在花时间制定解决方案的同时让用户运行错误的服务工作者代码,则最好保持简单,无操作的 service-worker.js
便利,例如以下:
self.addEventListener('install', () => {
self.skipWaiting();
});
那应该是您所有无操作service-worker.js
需要包含的内容。因为没有fetch
注册处理程序,所以来自受控页面的所有导航和资源请求最终都将直接针对网络,从而有效地为您提供了相同的行为,甚至根本不需要服务人员。
附加步骤
可以走得更远,并强行删除使用Cache Storage API存储的所有内容,或者显式完全注销服务工作者。在大多数情况下,这可能是过大的,遵循上述建议应该足以使您处于当前用户具有预期行为的状态,并且在修正错误后就可以重新部署更新了。 。即使是无操作的服务工作者,在启动时也会涉及一定程度的开销,因此,如果您没有重新部署有意义的服务工作者代码的计划,则可以采用注销服务工作者的途径。
如果您已经处在service-worker.js
使用HTTP缓存指令的情况下,它的生存期比用户可以等待的时间更长,请记住,桌面浏览器上的Shift + Reload会迫使页面重新加载到外部服务人员控制。并非每个用户都知道如何执行此操作,但是在移动设备上并非不可能。因此,不要依赖Shift + Reload作为可行的回滚计划。
如果您不知道服务人员的网址怎么办?
上面的信息假定你知道什么服务工作者URL是- service-worker.js
,sw.js
或别的东西的有效不变。但是,如果您在服务工作者脚本中包含某种版本控制或哈希信息,该service-worker.abcd1234.js
怎么办?
首先,尝试避免将来发生这种情况-这与最佳做法相反。但是,如果您已经部署了许多版本化的Service Worker URL,并且需要为所有用户禁用某些功能,无论他们可能注册了哪个URL,都有一种解决方法。
每当浏览器请求服务工作者脚本时,无论是初始注册还是更新检查,它都会设置一个名为的HTTP请求标头Service-Worker:
。
假设您完全控制后端HTTP服务器,则可以检查传入请求是否存在此Service-Worker:
标头,并且无论请求URL是什么,都始终使用no-op service worker脚本响应进行响应。
配置Web服务器以执行此操作的具体情况因服务器而异。
Clear-Site-Data:响应头
最后要注意的是:某些浏览器将自动清除特定数据,并可能在返回特殊HTTP响应标头作为任何响应的一部分时取消注册服务工作者Clear-Site-Data:
。
尝试从不良的Service Worker部署中恢复时,设置此标头可能会很有帮助,并且功能规范中包含了kill-switch场景作为示例用例。
重要的是,在您完全依赖浏览器支持Clear-Site-Data:
之前,请先检查一下浏览器支持的情况。截至2019年7月,100%支持服务工作者的浏览器均不支持此功能,因此,如果您担心要从所有浏览器中从有故障的服务工作者中恢复,则目前最安全的方法是与上述技术一起使用。Clear-Site-Data: