通过拦截 fetch 请求并配合 cachestorage api 可以实现请求缓存策略。具体做法是封装一个自定义的 fetch 函数,在发起网络请求前检查本地缓存是否命中,若命中则直接返回缓存数据,否则执行实际请求并将响应存入缓存。

如何判断缓存是否有效
判断缓存有效性主要依赖 HTTP 响应头中的 Cache-Control 和 ETag。在封装逻辑中,解析响应头的 max-age 值来决定缓存的存活时间,同时利用 ETag 进行强校验,确保缓存数据的最新性。

// 假设已定义 cacheName
const cache = await caches.open(cacheName);
const cachedResponse = await cache.match(request);
if (cachedResponse) {
const headers = new Headers(cachedResponse.headers);
const maxAge = headers.get('cache-control')?.match(/max-age=(\d+)/)?.[1];
if (maxAge && Date.now() - cachedResponse._timestamp < maxAge * 1000) {
return cachedResponse;
}
}
如何处理缓存未命中的情况
当缓存未命中时,需要发起真实的网络请求。获取响应后,克隆一份响应体并将其存入 CacheStorage,同时返回原始响应供页面使用。这种“先查缓存,再发请求,最后存缓存”的模式能显著减少重复请求。
立即学习“Java免费学习笔记(深入)”;

const response = await fetch(request); const responseClone = response.clone(); await cache.put(request, responseClone); return response;
基于 ETag 验证的具体问题
在使用 ETag 进行缓存验证时,如果服务器返回 304 Not Modified,说明缓存依然有效。此时应更新本地缓存的时间戳以延长其有效期,而不是重新下载整个资源,从而节省带宽并提升加载速度。


















