我正在使用带有 InjectManifest 插件的 workbox-webpack-plugin v5(最新版本)。以下是我的服务工作者源文件:
import { CacheableResponsePlugin } from 'workbox-cacheable-response';
import { clientsClaim, setCacheNameDetails, skipWaiting } from 'workbox-core';
import { ExpirationPlugin } from 'workbox-expiration';
import {
cleanupOutdatedCaches,
createHandlerBoundToURL,
precacheAndRoute,
} from 'workbox-precaching';
import { NavigationRoute, registerRoute, setCatchHandler } from 'workbox-routing';
import { CacheFirst, NetworkOnly, StaleWhileRevalidate } from 'workbox-strategies';
setCacheNameDetails({
precache: 'install-time',
prefix: 'app-precache',
runtime: 'run-time',
suffix: 'v1',
});
cleanupOutdatedCaches();
clientsClaim();
skipWaiting();
precacheAndRoute(self.__WB_MANIFEST);
precacheAndRoute([{ url: '/app-shell.html', revision: 'html-cache-1' }], {
cleanUrls: false,
});
const handler = createHandlerBoundToURL('/app-shell.html');
const navigationRoute = new NavigationRoute(handler);
registerRoute(navigationRoute);
registerRoute(
/.*\.css/,
new CacheFirst({
cacheName: 'css-cache-v1',
})
);
registerRoute(
/^https:\/\/fonts\.(?:googleapis|gstatic)\.com/,
new CacheFirst({
cacheName: 'google-fonts-cache-v1',
plugins: [
new CacheableResponsePlugin({
statuses: [0, 200],
}),
new ExpirationPlugin({
maxAgeSeconds: 60 * 60 * 24 * 365,
maxEntries: 30,
}),
],
})
);
registerRoute(
/.*\.js/,
new StaleWhileRevalidate({
cacheName: 'js-cache-v1',
})
);
setCatchHandler(new NetworkOnly());
我有以下问题/问题:
- 缓存组不正确。除了 google 字体之外的所有内容都在
workbox-precache-v2
或app-precache-install-time-v1
缓存组下,而不是单个缓存组,例如css-cache-v1
,js-cache-v1
. 但是,20 次中有 1 次显示正确的缓存组,我就是不知道为什么。 - 谷歌字体从内存缓存中显示。这是对的吗?它在离线状态下工作正常,但如果用户关闭浏览器/机器并返回离线模式会发生什么?
- '/app-shell.html' 的用法正确吗?它是一个快速后端应用程序,其中 * 作为所有路由的通配符,React Router 处理路由。从功能上讲,它可以离线工作。我没有任何 app-shell.html 页面。
谢谢你的帮助。