我正在我的计算机上玩服务工作者API,这样我就可以掌握如何在我的现实世界应用程序中从中受益。
在这种情况下,我所知道的删除坏的Service Worker脚本的唯一方法是通过chrome://serviceWorker-内部/
控制台。如果这个错误到达一个实时网站,哪个是解决它的最好方法?
谢谢
这是一个非常糟糕的情况,希望在生产中不会发生在你身上。
在这种情况下,如果你不想在火狐中浏览不同浏览器的开发工具,或者基于眨眼的浏览器的chrome://serviceworker-interals//code>,或者关于: serviceworkers(关于:将来调试#workers)的我想到两件事:
使用serviceworker更新机制。您的用户代理将检查注册的工作人员是否有任何更改,将获取该更改,并再次进入激活
阶段。因此,您可以更改serviceworker脚本,修复(清除缓存等)任何奇怪的情况并继续工作。唯一的缺点是,您需要等待浏览器更新worker,这可能需要1天的时间
我不确定清除浏览器数据是否会删除工作人员,所以这可能是另一个选择。
您可以使用javascript取消注册服务工作人员。这里有一个例子:
if ('serviceWorker' in navigator) {
navigator.serviceWorker.getRegistrations().then(function (registrations) {
//returns installed service workers
if (registrations.length) {
for(let registration of registrations) {
registration.unregister();
}
}
});
}
我想在这里扩展一些其他的答案,并从“在将服务人员推广到生产中时,我可以使用什么策略来确保我可以做出任何必要的改变”的角度来处理这个问题?这些更改可能包括修复您在生产中发现的任何小错误,或者它可能(但希望不是)包括由于不可克服的错误而中和服务工作者——所谓的“杀死开关”。
为了回答这个问题,假设你打电话给
navigator.serviceWorker.register('service-worker.js');
在您的页面上,意味着您的服务工作者JavaScript资源是service-worker.js
。(如果您不确定所使用的确切的Service Worker URL,请参阅下文-可能是因为您向Service Worker脚本添加了哈希或版本控制信息。)
问题归结为您如何着手解决服务人员的初始问题。js
code。如果这是一个小错误修复,那么您显然可以进行更改并重新部署服务人员。js
连接到您的托管环境。如果没有明显的bug修复,并且您不想让用户在花时间制定解决方案的同时运行bug service worker代码,那么最好保留一个简单的、无操作的service worker。js
handy,如下所示:
// A simple, no-op service worker that takes immediate control.
self.addEventListener('install', () => {
// Skip over the "waiting" lifecycle state, to ensure that our
// new service worker is activated immediately, even if there's
// another tab open controlled by our older service worker code.
self.skipWaiting();
});
/*
self.addEventListener('activate', () => {
// Optional: Get a list of all the current open windows/tabs under
// our service worker's control, and force them to reload.
// This can "unbreak" any open windows/tabs as soon as the new
// service worker activates, rather than users having to manually reload.
self.clients.matchAll({type: 'window'}).then(windowClients => {
windowClients.forEach(windowClient => {
windowClient.navigate(windowClient.url);
});
});
});
*/
这应该是你所有的无操作服务人员。js
需要包含。因为没有注册fetch
处理程序,所以来自受控页面的所有导航和资源请求最终都会直接与网络冲突,有效地为您提供与没有服务人员时相同的行为。
可以更进一步,强制删除使用缓存存储API存储的所有内容,或者完全显式取消注册服务辅助角色。对于大多数常见的情况,这可能是过度的,遵循上述建议应该足以让您处于当前用户获得预期行为的状态,并且一旦您修复了错误,您就可以重新部署更新。即使启动一个无操作的服务工作人员也会涉及一定程度的开销,因此,如果您没有计划重新部署有意义的服务工作人员代码,您可以选择取消注册服务工作人员。
如果您已经在为服务人员服务的情况下。js
由于HTTP缓存指令赋予它比用户可以等待的时间更长的生存期,请记住,桌面浏览器上的Shift重载将迫使页面在service worker控制之外重新加载。并不是每个用户都知道如何做到这一点,但这在移动设备上是不可能的。因此,不要依赖轮班重新加载作为可行的回滚计划。
上面的信息假设您知道服务辅助角色URL是什么-service-worker.js
,sw.js
,或者其他有效不变的东西。但是,如果您在服务工作人员脚本中包含某种版本控制或哈希信息,例如service-worker.abcd1234.js
,该怎么办?
首先,在将来尽量避免这种情况,因为这违背了最佳实践。但是,如果您已经部署了许多版本化的服务工作者URL,并且您需要为所有用户禁用这些内容,不管他们可能注册了哪个URL,那么有一个解决方法。
每次浏览器对Service Worker脚本发出请求时,不管是初始注册还是更新检查,它都会设置一个名为Service-Worker:
的HTTP请求标头。
假设您对后端HTTP服务器拥有完全控制权,则可以检查传入请求是否存在此服务工作者:
头,并始终使用无操作服务工作者脚本响应进行响应,而不管请求URL是什么。
最后一点注意:当作为任何响应的一部分返回特殊HTTP响应头时,某些浏览器将自动清除特定数据,并可能注销服务工作人员:清除站点数据:
。
当试图从错误的Service Worker部署中恢复时,设置此标头会很有帮助,并且作为示例用例包含在功能的规范中。
在您完全依赖浏览器作为终止开关之前,查看浏览器支持故事中的清除站点数据:
,这一点很重要。截至2019年7月,100%支持服务人员的浏览器都不支持该功能,因此,目前,如果您想从所有浏览器中的故障服务人员中恢复,最好使用清除站点数据:
以及上述技术。
我在这个链接的页面中实现的service worker演示有一些问题。我试着为这个演示尽可能地减少代码,但是粘贴到这里太长了。 一个问题是,当页面完全加载时,我转到Chrome devtools的“应用程序”选项卡,我在缓存中看到了很多内容: 不清楚为什么有这么多缓存...可能是我正在加载的字体,但仍然...似乎很大。 更令人担忧的是,当我单击该部分中的按钮(所有选项均已打勾)时,饼图中红色的部分
情况: 在我的网站上。com/game,我在 在我的服务器上,的最大值为。 问题: 。 问题是,每当用户访问,它显示空页面,不再执行任何操作。我无法让客户端获取新的。 如何让客户端获取新的?
我在上传到谷歌云存储的图像文件上创建了一个imageServing url,使用: 但似乎没有删除此url的方法。可用方法“deleteServingUrl”接受一个我不使用的bloKey。 这是否意味着我不需要删除servingUrl? ///////编辑 将Appengine与objectify一起使用。创建了一个servlet,UserImageEndpoint在web中定义了它。xml格式
我坐下来试着实施脑力操。语法似乎很简单。我很难让这个愚蠢的东西发挥作用。我做这件事已经有一段时间了;我承认我需要一些睡眠。也许这就是问题所在。翻译没有输出任何东西。我很确定问题很简单;我知道,在我更好地掌握了这个程序的发展方向之后,我需要对一些函数调用进行模块化。为什么我没有得到输出? 是大脑操的“你好世界”
本文向大家介绍基于Vue 服务端Cookies删除的问题,包括了基于Vue 服务端Cookies删除的问题的使用技巧和注意事项,需要的朋友参考一下 一般在我们做项目时,我们都会通过POST请求拿到服务器给到的set-Cookies,保存在浏览器的Cookie里 这里需要明确一点。缓存有三类 cookie、 sessionStorage 、localStorage cookie: 存储在用户本地终端
硬重装或硬刷新(例如,Chrome中的移位重装)似乎绕过了服务辅助角色。 例如,加载一个服务人员控制的页面,如https://airhorner.com/或https://wiki-offline.jakearchibald.com/,在开发工具中将网络设置为“离线”,然后重新加载页面会导致一个破碎的“没有互联网连接”页面。正常的重新加载会显示缓存的页面。) 有没有办法防止这种情况发生,或者在设备