【发布时间】:2022-01-23 07:32:27
【问题描述】:
考虑这个示例index.html 文件。
<!DOCTYPE html>
<html><head><title>test page</title>
<script>navigator.serviceWorker.register('sw.js');</script>
</head>
<body>
<p>test page</p>
</body>
</html>
使用此 Service Worker,旨在从缓存中加载,然后在必要时回退到网络。
cacheFirst = (request) => {
var mycache;
return caches.open('mycache')
.then(cache => {
mycache = cache;
cache.match(request);
})
.then(match => match || fetch(request, {credentials: 'include'}))
.then(response => {
mycache.put(request, response.clone());
return response;
})
}
addEventListener('fetch', event => event.respondWith(cacheFirst(event.request)));
这在 Chrome 62 上严重失败。刷新 HTML 根本无法在浏览器中加载,出现“无法访问此站点”错误;我必须改变刷新才能摆脱这种破碎状态。在控制台中,它说:
未捕获(承诺中)类型错误:无法在“ServiceWorkerGlobalScope”上执行“获取”:无法使用模式为“导航”且非空 RequestInit 的请求构造请求。
“构造一个请求”?!我不是在构建请求。我正在使用事件的请求,未修改。我在这里做错了什么?
【问题讨论】:
-
您的 Service Worker 是否已正确安装和注册?
-
它必须注册,否则刷新时不会炸毁页面!此外,它在开发工具应用程序选项卡中显示为正在运行/已注册。