我的index.html文件中的以下脚本:
<script>
const serviceWorkerCode = `
self.addEventListener('fetch', event => {
console.log('Fetch intercepted!', event.request.url);
event.respondWith(fetch(event.request));
});
`;
const blob = new Blob([serviceWorkerCode], { type: 'application/javascript' });
const blobUrl = URL.createObjectURL(blob);
navigator.serviceWorker.register(blobUrl)
.then(registration => {
console.log('Service Worker registered!');
})
.catch(error => {
console.error('Service Worker registration failed:', error);
});
URL.revokeObjectURL(blobUrl);
</script>
导致
(索引):43 Service Worker注册失败:类型错误:无法注册服务工作器:不支持脚本的URL协议('blob:https://localhost:7128/e50 c29 d9 - 330 b-41 c9 - 8 f5 d-615 f16120 ea 6')。
我怀疑这是因为blob协议不能与ServiceWorker.register函数一起工作,所以我希望有人知道如何基于javascript字符串激活ServiceWorker示例。
总体目标是创建一个包含所有网站文件的html文件作为嵌入流,ServiceWorker在获取时提供这些流。如果有人以另一种方式解决了这个问题,那也是一个很好的答案。
1条答案
按热度按时间wfveoks01#
TL;DR:你不能。
http:
或https:
URI方案,如果没有则抛出TypeError
。blob:
或data:
URI方案是行不通的。scriptURL
的方案不是“http
“和“https
“之一,则使用TypeError
拒绝promise并中止这些步骤。scopeURL
的方案不是“http
“和“https
“之一,则使用TypeError
拒绝promise并中止这些步骤。annevk发表于十二月8,2014
我们不希望支持这种做法,因为这意味着对服务器的一次成功攻击可能会危及用户很长一段时间。[...]如果它允许以阻止受控源的所有者取消注册的方式注册SW,我们不希望这样做
mkruisselbrink发表于2016年8月26日
问题是,要注销,你需要首先实际获取在该源上运行的代码。如果service worker没有实际的网络url来检查更新,service worker可以拦截所有导航,并且永远不会让任何对服务器的新请求实际到达服务器,所以即使修复服务器也不能修复客户端。基本上,整个24小时的更新检查将不再可能使用blob URL。