perf(pwa): ⚡ change cache strategy for non-pre-cached resources
This commit is contained in:
parent
4a917971d0
commit
d7716a88a8
|
|
@ -110,21 +110,28 @@ async function fetchHandler(event: FetchEvent) {
|
||||||
return cached
|
return cached
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cache first and refresh
|
// Fastest and cache refresh
|
||||||
if (url.origin === location.origin && method === 'GET') {
|
if (url.origin === location.origin && method === 'GET') {
|
||||||
const cached = await cache.match(event.request)
|
const cache = await getDynCache()
|
||||||
|
|
||||||
const response = fetch(event.request)
|
// Get cache or throw
|
||||||
.then((response) => {
|
const cachedOrError = cache.match(event.request).then((response) => {
|
||||||
if (!response.ok) {
|
if (response) return response
|
||||||
throw new Error(
|
throw new Error(`no cache available for "${url}"`)
|
||||||
`failed to get request: [${response.status}] ${response.statusText}`,
|
})
|
||||||
)
|
// Fetch and cache
|
||||||
}
|
const fetchedAndCached = fetch(event.request).then((response) => {
|
||||||
// Update cache if ok
|
|
||||||
cache.put(event.request, response.clone())
|
cache.put(event.request, response.clone())
|
||||||
return response
|
return response
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Get fastest
|
||||||
|
return Promise.race([cachedOrError, fetchedAndCached])
|
||||||
|
}
|
||||||
|
|
||||||
|
// Network only
|
||||||
|
return fetch(event.request)
|
||||||
|
}
|
||||||
async function getDynCache(): Promise<Cache> {
|
async function getDynCache(): Promise<Cache> {
|
||||||
const version = await swStorage.getItem<number>('$sw.dyn-cache.version')
|
const version = await swStorage.getItem<number>('$sw.dyn-cache.version')
|
||||||
// Create cache
|
// Create cache
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue