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

能否在页面加载之前禁用服务辅助角色?

宰父衡
2023-03-14

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

目前,我们已经设置了Service Worker,以便在安装时删除所有缓存(以及每当发生任何事情时作为预防措施),以及一些JavaScript,以便在新页面实际加载时取消Service 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答案,包括这个,但是它们倾向于依赖用户手动做一些事情来获取新内容,即通过硬重载或通过浏览器设置手动禁用服务人员。然而,在我的案例中,我们不能依赖手动用户操作。

共有2个答案

舒赞
2023-03-14

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

$.each(['index.html','file1.js','file2.js','file3.js'],function(index,file) {
      $.get(file+'?t='+new Date().getTime(), function(){});
});
location.reload(true);

必须关闭ServiceWorker才能停止所有使用它的窗口。如果它是一个网络应用程序,您可以使用Windows。close();

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

居京
2023-03-14

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

<script type="text/javascript" src="/js/scipt1.js?t=05042018121212"/>

要在文件名中动态附加新的时间戳,请检查此答案

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

 类似资料:
  • 问题内容: 在我的手机网站上。我一直在尝试加载Adsense Mobile广告,但是在页面加载后,它们继续占据整个页面。 我确实发现,如果我禁用了ajax,则该页面将与广告一起很好地加载。这仅在我加载的第二页上有效,因为我单击了带有标签的链接… 这样可以使下一页完美加载。 问题 :由于启用了Ajax,我认为adsense广告会覆盖加载的第一页。 基本上我页面的第一部分是这样的… 我确实尝试禁用代码

  • 我需要在基于url的懒惰模块中加载详细信息。所以,我使用了懒惰的辅助路由。但是,当我使用辅助路由时,我面临以下问题。 错误错误:未捕获(promise中):错误:无法匹配任何路线。URL段:“lazy/aux1”错误:无法匹配任何路由。URL段:ApplyRedirects.noMatchError处的“lazy/aux 1”(https://lazy-load-auxiliary-b7vpg-e

  • 我正在使用MongoDB构建一个架构。 我发现在辅助服务器上发送读取请求以满足统计需求是可能的(也是最佳实践)。结果将是一个更好的表现。 谢谢你的帮助。

  • 我有一个方法,可以为WebView的WebEngine设置一个新的网页,需要等到网页加载完成后才能继续使用当前方法。 基本上我想要: 我尝试过使用ChangeListener(),但它只会在我的方法完成执行后执行。我在谷歌上搜索了许多导致更多挫折感的术语,比如“java非阻塞等待布尔值”。最终,我成功地启动了新线程(以防止应用程序GUI锁定)并使用了倒计时(与Thread.join()相反)。下面

  • 为程序制作辅助功能是很重要的。在这里,我们很高兴地向你们介绍Devtron和Spectron。这两个新功能有机会使开发者们让他们的应用程序更加可用。 Electron 应用中有关辅助功能的开发和网站是相似的,因为两者最终使用的都是HTML. 然而, 对于Electron应用, 你不能使用在线的辅助功能审查者, 因为你的应用没有一个URL可以提供给审查者. 然而这些新功能将这些审查工具带到您的Ele