124 lines
2.5 KiB
TypeScript
124 lines
2.5 KiB
TypeScript
import { registerRoute } from 'workbox-routing'
|
|
import {
|
|
CacheFirst,
|
|
StaleWhileRevalidate,
|
|
NetworkOnly,
|
|
} from 'workbox-strategies'
|
|
import { ExpirationPlugin } from 'workbox-expiration'
|
|
|
|
const oneWeek = 7 * 24 * 3600
|
|
|
|
if (process.env.NODE_ENV === 'development') {
|
|
registerRoute(/\.js/, new NetworkOnly())
|
|
registerRoute(/\.css/, new NetworkOnly())
|
|
}
|
|
|
|
//#region Pictures
|
|
registerRoute(
|
|
/\/preview\/\d+/,
|
|
new CacheFirst({
|
|
cacheName: 'texture-preview-v2',
|
|
fetchOptions: {
|
|
credentials: 'omit',
|
|
},
|
|
plugins: [
|
|
new ExpirationPlugin({ maxAgeSeconds: oneWeek, purgeOnQuotaError: true }),
|
|
],
|
|
}),
|
|
)
|
|
|
|
registerRoute(
|
|
/\/app\/.*\.webp/,
|
|
new StaleWhileRevalidate({
|
|
cacheName: 'webp-resource-v1',
|
|
fetchOptions: {
|
|
credentials: 'omit',
|
|
},
|
|
}),
|
|
)
|
|
|
|
registerRoute(
|
|
/\/avatar\/\d+/,
|
|
new CacheFirst({
|
|
cacheName: 'avatar-v2',
|
|
fetchOptions: {
|
|
credentials: 'omit',
|
|
},
|
|
plugins: [new ExpirationPlugin({ maxAgeSeconds: oneWeek })],
|
|
}),
|
|
)
|
|
|
|
//#endregion
|
|
|
|
//#region JavaScript files
|
|
registerRoute(
|
|
/.+\/app\/\w{2,3}\.\w{7}\.js$/,
|
|
new CacheFirst({
|
|
cacheName: 'javascript-v1',
|
|
fetchOptions: {
|
|
credentials: 'omit',
|
|
mode: 'cors',
|
|
},
|
|
plugins: [
|
|
new ExpirationPlugin({ maxAgeSeconds: oneWeek, purgeOnQuotaError: true }),
|
|
],
|
|
}),
|
|
)
|
|
registerRoute(
|
|
/.+\/plugins\/.+\.js$/,
|
|
new StaleWhileRevalidate({
|
|
cacheName: 'javascript-v1',
|
|
fetchOptions: {
|
|
credentials: 'omit',
|
|
mode: 'cors',
|
|
},
|
|
plugins: [
|
|
new ExpirationPlugin({ maxAgeSeconds: oneWeek, purgeOnQuotaError: true }),
|
|
],
|
|
}),
|
|
)
|
|
//#endregion
|
|
|
|
//#region CSS files
|
|
registerRoute(
|
|
/.+\/app\/.*\.css$/,
|
|
new CacheFirst({
|
|
cacheName: 'stylesheet-v1',
|
|
fetchOptions: {
|
|
credentials: 'omit',
|
|
mode: 'cors',
|
|
},
|
|
plugins: [
|
|
new ExpirationPlugin({ maxAgeSeconds: oneWeek, purgeOnQuotaError: true }),
|
|
],
|
|
}),
|
|
)
|
|
registerRoute(
|
|
/.+\/plugins\/.+\.css$/,
|
|
new StaleWhileRevalidate({
|
|
cacheName: 'stylesheet-v1',
|
|
fetchOptions: {
|
|
credentials: 'omit',
|
|
mode: 'cors',
|
|
},
|
|
plugins: [
|
|
new ExpirationPlugin({ maxAgeSeconds: oneWeek, purgeOnQuotaError: true }),
|
|
],
|
|
}),
|
|
)
|
|
//#endregion
|
|
|
|
//#region Fonts
|
|
registerRoute(
|
|
({ request }) => request.destination === 'font',
|
|
new StaleWhileRevalidate({
|
|
cacheName: 'font-v1',
|
|
fetchOptions: {
|
|
credentials: 'omit',
|
|
mode: 'cors',
|
|
},
|
|
plugins: [new ExpirationPlugin({ maxEntries: 12 })],
|
|
}),
|
|
)
|
|
//#endregion
|