81 lines
2.3 KiB
TypeScript
81 lines
2.3 KiB
TypeScript
/*
|
|
* This file (which will be your service worker)
|
|
* is picked up by the build system ONLY if
|
|
* quasar.config file > pwa > workboxMode is set to "InjectManifest"
|
|
*/
|
|
|
|
declare const self: ServiceWorkerGlobalScope &
|
|
typeof globalThis & { skipWaiting: () => Promise<void> };
|
|
|
|
import { clientsClaim } from 'workbox-core';
|
|
import {
|
|
precacheAndRoute,
|
|
cleanupOutdatedCaches,
|
|
createHandlerBoundToURL,
|
|
} from 'workbox-precaching';
|
|
import { registerRoute, NavigationRoute } from 'workbox-routing';
|
|
import { CacheFirst, NetworkFirst } from 'workbox-strategies';
|
|
import { ExpirationPlugin } from 'workbox-expiration';
|
|
import { CacheableResponsePlugin } from 'workbox-cacheable-response';
|
|
import type { WorkboxPlugin } from 'workbox-core/types';
|
|
|
|
self.skipWaiting().catch((error) => {
|
|
console.error('Error during service worker activation:', error);
|
|
});
|
|
clientsClaim();
|
|
|
|
// Use with precache injection
|
|
precacheAndRoute(self.__WB_MANIFEST);
|
|
|
|
cleanupOutdatedCaches();
|
|
|
|
// Cache app shell and static assets with Cache First strategy
|
|
registerRoute(
|
|
// Match static assets
|
|
({ request }) =>
|
|
request.destination === 'style' ||
|
|
request.destination === 'script' ||
|
|
request.destination === 'image' ||
|
|
request.destination === 'font',
|
|
new CacheFirst({
|
|
cacheName: 'static-assets',
|
|
plugins: [
|
|
new CacheableResponsePlugin({
|
|
statuses: [0, 200],
|
|
}) as WorkboxPlugin,
|
|
new ExpirationPlugin({
|
|
maxEntries: 60,
|
|
maxAgeSeconds: 30 * 24 * 60 * 60, // 30 days
|
|
}) as WorkboxPlugin,
|
|
],
|
|
})
|
|
);
|
|
|
|
// Cache API calls with Network First strategy
|
|
registerRoute(
|
|
// Match API calls
|
|
({ url }) => url.pathname.startsWith('/api/'),
|
|
new NetworkFirst({
|
|
cacheName: 'api-cache',
|
|
plugins: [
|
|
new CacheableResponsePlugin({
|
|
statuses: [0, 200],
|
|
}) as WorkboxPlugin,
|
|
new ExpirationPlugin({
|
|
maxEntries: 50,
|
|
maxAgeSeconds: 24 * 60 * 60, // 24 hours
|
|
}) as WorkboxPlugin,
|
|
],
|
|
})
|
|
);
|
|
|
|
// Non-SSR fallbacks to index.html
|
|
// Production SSR fallbacks to offline.html (except for dev)
|
|
if (process.env.MODE !== 'ssr' || process.env.PROD) {
|
|
registerRoute(
|
|
new NavigationRoute(createHandlerBoundToURL(process.env.PWA_FALLBACK_HTML), {
|
|
denylist: [new RegExp(process.env.PWA_SERVICE_WORKER_REGEX), /workbox-(.)*\.js$/],
|
|
}),
|
|
);
|
|
}
|