首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >您可以在页面加载之前禁用服务工作进程吗?

您可以在页面加载之前禁用服务工作进程吗?
EN

Stack Overflow用户
提问于 2018-04-05 03:29:19
回答 2查看 2.6K关注 0票数 3

我和我的团队有一个项目,最初是作为PWA构建的,但后来决定放弃这个想法,因为我们意识到它需要比最初计划的更频繁地更改。然而,服务人员已经上线了,还有一个新设计的网站登录页面。尽管我们努力清除PWA缓存,但我们的客户端仍然报告说,他们正在接收网站的旧缓存版本。

目前,我们将服务工作者设置为在安装时删除所有缓存(作为预防措施,无论何时发生任何事情),以及在新页面实际加载时注销服务工作者的一些JavaScript。然而,问题是,在用户向网站发出请求之前,所有这些都不会运行,而此时浏览器已经加载了缓存的内容。是否有可能清除此缓存并阻止浏览器加载任何已缓存的内容?

当前服务-worker.js

代码语言:javascript
复制
// 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中的脚本

代码语言:javascript
复制
(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,但它们倾向于依赖用户手动获取新内容,即。通过硬重新加载或通过浏览器设置手动禁用服务工作者。然而,在我的例子中,我们不能依赖手动用户操作。

EN

回答 2

Stack Overflow用户

发布于 2018-04-05 13:37:07

解决此问题的一种方法是在文件(js,css)名称的末尾添加时间戳,以便每次发出请求时,缓存键在服务工作器中不可用,因此它倾向于在每次加载时获得文件的新版本。

代码语言:javascript
复制
<script type="text/javascript" src="/js/scipt1.js?t=05042018121212"/>

要在文件名中动态添加新的时间戳,请检查此answer

但如果HTML本身被缓存,这可能就不可靠了。

票数 0
EN

Stack Overflow用户

发布于 2018-07-23 14:45:23

在“更新”所有内容之前添加以下内容:

代码语言:javascript
复制
$.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();

这段代码只是加载列表中文件的新版本。如果有任何内部缓存,它们将全部更新。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49658974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档