我有一个用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
(作为应用程序外壳),因为它是使用用户值呈现的模板。
答案 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”,则即使网络连接打开,页面也会显示为脱机。