Workbox 是一个用于简化渐进式Web应用(PWA)中Service Worker开发的库。它提供了一套工具和策略,帮助开发者实现离线优先的应用体验。Workbox 的运行时缓存(Runtime Caching)允许你在Service Worker中动态地缓存和检索资源。
Workbox 运行时缓存不能与带查询参数的URL一起工作。
Workbox 的默认行为是基于URL进行缓存匹配的,而带查询参数的URL会导致每次请求的URL都不同,即使资源内容相同,也会被视为不同的请求,从而无法正确地从缓存中获取资源。
urlPattern
和 handler
你可以使用 urlPattern
和 handler
来精确控制哪些URL需要缓存,以及如何处理这些请求。
import { registerRoute } from 'workbox-routing';
import { StaleWhileRevalidate } from 'workbox-strategies';
registerRoute(
({ url }) => url.pathname.startsWith('/api/'),
new StaleWhileRevalidate({
cacheName: 'api-cache',
})
);
在这个例子中,我们只缓存以 /api/
开头的URL,并且使用 StaleWhileRevalidate
策略。
CacheKeyGenerator
你可以自定义 CacheKeyGenerator
来生成唯一的缓存键,即使URL带有查询参数。
import { registerRoute } from 'workbox-routing';
import { StaleWhileRevalidate } from 'work.js';
class QueryParamCacheKeyGenerator {
generateKey(request) {
const url = new URL(request.url);
url.search = '';
return url.toString();
}
}
const cacheKeyGenerator = new QueryParamCacheKeyGenerator();
registerRoute(
({ request }) => request.destination === 'script',
new StaleWhileRevalidate({
cacheName: 'scripts',
cacheKeyGenerator: cacheKeyGenerator,
})
);
在这个例子中,我们移除了URL中的查询参数,生成了一个唯一的缓存键。
NetworkFirst
策略如果你希望优先从网络获取资源,然后再使用缓存,可以使用 NetworkFirst
策略。
import { registerRoute } from 'workbox-routing';
import { NetworkFirst } from 'workbox-strategies';
registerRoute(
({ url }) => url.pathname.startsWith('/api/'),
new NetworkFirst({
cacheName: 'api-cache',
})
);
NetworkFirst
策略可以确保获取最新的数据。StaleWhileRevalidate
策略来提高加载速度。通过以上方法,你可以有效地解决Workbox运行时缓存不能与带查询参数的URL一起工作的问题。
领取专属 10元无门槛券
手把手带您无忧上云