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
|
||||
}
|
||||
|
||||
// Cache first and refresh
|
||||
// Fastest and cache refresh
|
||||
if (url.origin === location.origin && method === 'GET') {
|
||||
const cached = await cache.match(event.request)
|
||||
const cache = await getDynCache()
|
||||
|
||||
const response = fetch(event.request)
|
||||
.then((response) => {
|
||||
if (!response.ok) {
|
||||
throw new Error(
|
||||
`failed to get request: [${response.status}] ${response.statusText}`,
|
||||
)
|
||||
}
|
||||
// Update cache if ok
|
||||
cache.put(event.request, response.clone())
|
||||
return response
|
||||
})
|
||||
// Get cache or throw
|
||||
const cachedOrError = cache.match(event.request).then((response) => {
|
||||
if (response) return response
|
||||
throw new Error(`no cache available for "${url}"`)
|
||||
})
|
||||
// Fetch and cache
|
||||
const fetchedAndCached = fetch(event.request).then((response) => {
|
||||
cache.put(event.request, response.clone())
|
||||
return response
|
||||
})
|
||||
|
||||
// Get fastest
|
||||
return Promise.race([cachedOrError, fetchedAndCached])
|
||||
}
|
||||
|
||||
// Network only
|
||||
return fetch(event.request)
|
||||
}
|
||||
async function getDynCache(): Promise<Cache> {
|
||||
const version = await swStorage.getItem<number>('$sw.dyn-cache.version')
|
||||
// Create cache
|
||||
|
|
|
|||
Loading…
Reference in a new issue