- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个服务人员。这是安装事件:
self.addEventListener('install', function (event) {
console.log('Installing Service Worker ...', event);
return self.skipWaiting()
.then(() => caches.open(CACHE_STATIC_NAME))
.then(function (cache) {
return cache.addAll([
'./file1.html',
'./file2.html'
])
})
});
出于某种原因,当我编辑 service worker 代码并更新 service worker 文件 URL 中的查询参数时,它会安装但不会激活(根据 Chrome DevTools)——即使我调用了 self。 skipWaiting()
.
奇怪的是,如果我进入控制台,进入 service worker 的范围并自己键入 self.skipWaiting()
,它会立即激活。
几个小时以来,我一直在努力弄清楚发生了什么,但我完全被难住了。我在这里遗漏了什么吗?
最佳答案
旧的 SW 在它仍在运行任务时可能不会停止——例如,如果它有一个长时间运行的获取请求(例如服务器发送的事件/事件源,或获取流;虽然我不认为 websockets 会导致这个作为 SW我认为会忽略它们)。
不过,我发现浏览器之间的行为有所不同。 Chrome 似乎在现有任务运行时等待(因此 skipWaiting 将失败...),但 Safari 似乎终止了任务并激活了新的软件。
测试这是否会导致您的问题的一个好方法是在您请求 skipWaiting(以终止网络连接)后立即终止您的服务器。 (仅在开发工具中单击“离线”似乎并不会终止所有正在运行的连接,例如 EventSources 保持运行。)
您可以让 SW 忽略某些路由(如下),或者您可以尝试强制终止请求(可能使用 AbortController)。
self.addEventListener('fetch', function(event) {
const { method, url } = event.request;
if(event.request.method !== "GET") return false;
if(url === "https://example.com/poll") return false;
event.respondWith(
caches.match(match).then(function(response) {
return response || fetch(event.request);
})
);
});
skipWaiting 的过程在这个规范中:
https://w3c.github.io/ServiceWorker/#try-activate-algorithm
但是我发现在激活新软件之前浏览器是应该等待任务还是终止任务(或者将它们转移到新软件?)不是很清楚;如前所述,目前浏览器之间的工作方式似乎有所不同......
关于javascript - self.skipWaiting() 在 Service Worker 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54628657/
我正在开发一个 pwa(带有类星体的 vue 应用程序),我真的很困惑,因为按照指示包含选项会导致我的服务 worker workbox.core.skipWaiting() 中的指令导致Servic
我使用 Workbox 来预缓存渲染应用程序 shell 所需的 Assets ,包括 index.html 的基本版本. Workbox 假设 index.html在缓存中可用,否则页面导航失败,因
描述: 我们使用 sw precache 来预先缓存脚本,因此为了更新脚本,我们提供了重新加载选项,为此,我们正在监听工作人员消息,以跳过等待新安装的服务工作人员,原因未知,我们没有得到正确的信息 导
我试图了解 skipWaiting 之间的区别和 clientsClaim .据我了解:调用 skipWaiting将导致新的 Service Worker 跳过等待阶段,并立即变为事件状态。 cli
我已经实现了 Workbox 以使用 webpack 生成我的服务 worker 。这有效 - 我可以确认在运行 "generate-sw": "workbox inject:manifest" 时生
我有一个服务人员。这是安装事件: self.addEventListener('install', function (event) { console.log('Installing Ser
默认 skipWaiting在 Workbox 中设置为 false。假设您仅使用 Workbox 创建的 service worker 进行缓存,将其设置为 true 有什么缺点吗?如果不这样做,您
要在安装后立即激活 service worker,我使用 self.skipWaiting()在安装监听器中。要立即控制页面(无需页面导航,例如页面加载),我使用 self.clients.claim
在阅读了很多教程后,我发现 self.skipWaiting() 用于立即对现有 serviceWorker 应用更新,而 self.clients.claim()用于在第一次加载时立即进行控制。 s
我是一名优秀的程序员,十分优秀!