登录后注册路由-Google Workbox SW

时间:2020-04-17 07:26:45

标签: javascript service-worker workbox

我有一个用vanilla js编写的SPA,该SPA处理带有前缀-/ mail的路由,我想在这里缓存应用程序外壳并将其用于所有子路由,例如/ mail / settings,/ mail / inbox ...等等, 登录后,此SPA由app.html提供。所以我在用这个-

readLine(qint64 maxlen = 0)

登录后注册服务工作者时,此方法工作正常。(//this has to be precached for the below createHandlerBoundToURL workbox.precaching.precacheAndRoute([{ url:"/mail" } ]) var pagesRouteHandler = workbox.precaching.createHandlerBoundToURL('/mail'); //I need this for dynamic url caching, var navigationRoutes = new workbox.routing.NavigationRoute(pagesRouteHandler, { allowlist: [ new RegExp('/mail/*'), ], }); workbox.routing.registerRoute(navigationRoutes);

但是现在,我也想缓存登录/注册屏幕,它们是单独的html文件,即SPA之外。并且,当我在这些html文件中注册服务工作者时,以上代码尝试通过发出get请求来预缓存navigator.serviceWorker.register('/sw.js');路由。但是响应将是服务器在没有服务器会话的情况下重定向到登录页面,因此相同的/mail将被预先缓存为login.html路由,而不是实际的SPA shell(html)。< / p>

因此,我想在登录后或正确注册/ mail路由后(例如在注册/mail路由的回调中)注册上述/ mail和动态路由。我该怎么做?

注意:没有用户会话,我无法将app.html从服务器发送到/mail(作为应用程序外壳),因为它是使用用户值呈现的模板。

1 个答案:

答案 0 :(得分:0)

我通过以下方法解决了这个问题, 我没有预先缓存根路径,而是将其缓存为普通路由,

tokio::spawn(async {
    let connection = TcpStream::connect("172.16.100.10:1001").await.unwrap();
    let mut reader = BufReader::new(connection);

    loop {
        let mut line = String::new();
        reader.read_line(&mut line).await.unwrap();
        println!("{}", line);
    }
});

对于所有子路由(由于它们是由前端本身处理的,并且需要相同的“ / mail”应用程序外壳程序),我正在注册要从缓存处理的RegExp路由。

workbox.routing.registerRoute("/mail",new workbox.strategies.StaleWhileRevalidate({
  cacheName: "appShell",
}));

虽然这对我有用,但我希望有一个更明智和更好的解决方案,可能是一些库内置的功能。

此外,这里还有一个问题,如果由于某种原因删除了缓存“ / mail”,则即使网络连接打开,页面也会显示为脱机。

相关问题