gpt4 book ai didi

javascript - Service Worker 离线支持 pushstate 和客户端路由

转载 作者:太空宇宙 更新时间:2023-11-04 14:27:44 25 4
gpt4 key购买 nike

我正在使用 service worker 为我的单页网络应用引入离线功能。这非常简单 - 在网络可用时使用网络,如果网络不可用则尝试从缓存中获取:

服务 worker .js:

self.addEventListener("fetch", event => {
if(event.request.method !== "GET") {
return;
}
event.respondWith(
fetch(event.request)
.then(networkResponse => {
var responseClone = networkResponse.clone();
if (networkResponse.status == 200) {
caches.open("mycache").then(cache => cache.put(event.request, responseClone));
}
return networkResponse;
})
.catch(_ => {
return caches.match(event.request);
})
)
})

因此它拦截所有 GET 请求并缓存它们以供将来使用,包括初始页面加载。

在 DevTools 中切换到“离线”并在应用程序的根目录下刷新按预期工作。

但是,我的应用程序使用 HTML5 pushstate 和客户端路由器。用户可以导航到新路线,然后离线,然后点击刷新,然后会收到“无互联网”消息,因为服务工作人员从未被告知这个新 URL。

我想不出解决办法。与大多数 SPA 一样,我的服务器配置为为许多包罗万象的 URL 提供 index.html。我需要为服务 worker 提供某种类似的行为。

最佳答案

在您的 fetch 处理程序中,您需要检查 event.request.mode 是否设置为 'navigate'。如果是,则它是一个导航,而不是使用与特定 URL 匹配的缓存响应进行响应,您可以使用 index.html 的缓存响应进行响应。 (或 app-shell.html,或您用于 SPA 的通用 HTML 的任何 URL。)

更新后的 fetch 处理程序大致如下所示:

self.addEventListener('fetch', event => {
if (event.request.method !== 'GET') {
return;
}

if (event.request.mode === 'navigate') {
event.respondWith(caches.match('index.html'));
return;
}

// The rest of your fetch handler logic goes here.
});

这是服务 worker 的常见用例,如果您更喜欢使用预打包的解决方案,NavigationRoute classworkbox-routing module可以为您自动化。

关于javascript - Service Worker 离线支持 pushstate 和客户端路由,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45309959/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com