我和我的团队有一个项目,最初是作为PWA构建的,但后来决定放弃这个想法,因为我们意识到它需要比最初计划的更频繁地更改。然而,服务人员已经上线了,还有一个新设计的网站登录页面。尽管我们努力清除PWA缓存,但我们的客户端仍然报告说,他们正在接收网站的旧缓存版本。
目前,我们将服务工作者设置为在安装时删除所有缓存(作为预防措施,无论何时发生任何事情),以及在新页面实际加载时注销服务工作者的一些JavaScript。然而,问题是,在用户向网站发出请求之前,所有这些都不会运行,而此时浏览器已经加载了缓存的内容。是否有可能清除此缓存并阻止浏览器加载任何已缓存的内容?
当前服务-worker.js
// Caching
var cacheCore = 'mkeSculptCore-0330121058';
var cacheAssets = 'mkeSculptAssets-0330121058';
self.addEventListener('install', function (event) {
self.skipWaiting();
caches.keys().then(function (names) {
for (let name of names)
caches.delete(name);
});
});
self.addEventListener('activate', function (event) {
caches.keys().then(function (names) {
for (let name of names)
caches.delete(name);
});
});
self.addEventListener('fetch', function (event) {
caches.keys().then(function (names) {
for (let name of names)
caches.delete(name);
});
});
index.html中的脚本
(function () {
if ('serviceWorker' in navigator) {
navigator.serviceWorker.getRegistrations().then(function (registrations) {
//returns installed service workers
if (registrations.length) {
for (let registration of registrations) {
registration.unregister();
}
}
});
}
})();
到目前为止,我已经读到了其他一些类似的StackOverflow答案,including this one,但它们倾向于依赖用户手动获取新内容,即。通过硬重新加载或通过浏览器设置手动禁用服务工作者。然而,在我的例子中,我们不能依赖手动用户操作。
发布于 2018-04-05 13:37:07
解决此问题的一种方法是在文件(js,css)名称的末尾添加时间戳,以便每次发出请求时,缓存键在服务工作器中不可用,因此它倾向于在每次加载时获得文件的新版本。
<script type="text/javascript" src="/js/scipt1.js?t=05042018121212"/>
要在文件名中动态添加新的时间戳,请检查此answer
但如果HTML本身被缓存,这可能就不可靠了。
发布于 2018-07-23 14:45:23
在“更新”所有内容之前添加以下内容:
$.each(['index.html','file1.js','file2.js','file3.js'],function(index,file) {
$.get(file+'?t='+new Date().getTime(), function(){});
});
location.reload(true);
要使ServiceWorker停止使用它的所有窗口,必须将其关闭。如果是webapp,你可以使用window.close();
这段代码只是加载列表中文件的新版本。如果有任何内部缓存,它们将全部更新。
https://stackoverflow.com/questions/49658974
复制相似问题