在 Workbox 中注册非导航路由
Register non-navigation routes in Workbox
有没有办法在Workbox中只匹配非导航请求?例如,我有一个包含多个 AMP 页面的应用程序,我想在我的应用程序 shell 中注入这些页面,因此我拦截了对这些页面的所有导航并使用 shell 进行响应,如下所示:
workboxSW.router.registerNavigationRoute('shell.html', {
whitelist: [/./]
});
我还想拦截所有其他请求并使用缓存优先策略处理它们,如下所示:
workboxSW.router.registerRoute('/*',
workboxSW.strategies.cacheFirst()
);
但是这条路线与第一条路线重叠。我可以用以下代码替换这两条路线以获得我正在寻找的行为:
workboxSW.router.registerRoute('/*', args => {
if (args.event.request.mode !== 'navigate') {
return workboxSW.strategies.cacheFirst().handle(args);
}
return caches.match('/shell.html', {ignoreSearch: true});
});
但是 request.mode 是 not supported by several mobile browsers(甚至一些支持 Service Worker 的)并且有一些失败的极端情况。
是否有一种方便、最佳实践的方式来匹配非导航请求?
首先,您使用如此宽泛的正则表达式是在自找麻烦。
一个简单的步骤是首先为您 知道 的请求添加一个路由,可以首先缓存而不是导航路由(即具有 js 等扩展名的路径,css, png, jpg).
然后 - 使用您对构建的了解来匹配其他请求(即所有网络请求的页面都以 html 结尾,或者您是否有漂亮的 url 以斜杠结尾?)。
您实际上可能只想添加一个默认路由,这样如果没有匹配的路由,则回退到默认值并让它服务于 shell。
有没有办法在Workbox中只匹配非导航请求?例如,我有一个包含多个 AMP 页面的应用程序,我想在我的应用程序 shell 中注入这些页面,因此我拦截了对这些页面的所有导航并使用 shell 进行响应,如下所示:
workboxSW.router.registerNavigationRoute('shell.html', {
whitelist: [/./]
});
我还想拦截所有其他请求并使用缓存优先策略处理它们,如下所示:
workboxSW.router.registerRoute('/*',
workboxSW.strategies.cacheFirst()
);
但是这条路线与第一条路线重叠。我可以用以下代码替换这两条路线以获得我正在寻找的行为:
workboxSW.router.registerRoute('/*', args => {
if (args.event.request.mode !== 'navigate') {
return workboxSW.strategies.cacheFirst().handle(args);
}
return caches.match('/shell.html', {ignoreSearch: true});
});
但是 request.mode 是 not supported by several mobile browsers(甚至一些支持 Service Worker 的)并且有一些失败的极端情况。
是否有一种方便、最佳实践的方式来匹配非导航请求?
首先,您使用如此宽泛的正则表达式是在自找麻烦。
一个简单的步骤是首先为您 知道 的请求添加一个路由,可以首先缓存而不是导航路由(即具有 js 等扩展名的路径,css, png, jpg).
然后 - 使用您对构建的了解来匹配其他请求(即所有网络请求的页面都以 html 结尾,或者您是否有漂亮的 url 以斜杠结尾?)。
您实际上可能只想添加一个默认路由,这样如果没有匹配的路由,则回退到默认值并让它服务于 shell。