关于此API https://developer.mozilla.org/en-US/docs/Web/API/Cache,我还要设置cache lifetime
。
比方说,cache this request for no longer than 10 minutes
答案 0 :(得分:1)
不幸的是,这不可能。
您链接的文档专门指出,由Cache API提供的缓存对象中的项目不会自动更新或删除。您必须自己实现这种逻辑。
您应该注意库,例如。 Workbox已经为您做到了。如果其他功能适合您的用例,则可以利用它。
答案 1 :(得分:0)
这是我没有工作箱的情况下实现的方法。 (如果您可以切换到workbox,请继续阅读,如果不继续阅读的话)
onCacheMatch将“ x-sw-cache-timestamp”与currentTime进行比较,如果超过10分钟窗口,则从网络获取。
fucntion onFetchComplete(response)
{
var timestampHeader = {};
timestampHeader["x-sw-cache-timestamp"] = Date.now();
return serviceWorker
.cloneResponse(response, timestampHeader)
.then(function (responseCopy)
{
cache.add(request, responseCopy.clone());
return responseCopy;
});
}
serviceWorker.cloneResponse = function (response, extraHeaders)
{
if (!response)
{
return serviceWorker.Promise.resolve();
}
var init = {
status: response.status,
statusText: response.statusText,
headers: extraHeaders || {}
};
response.headers.forEach(function (val, key)
{
init.headers[key] = val;
});
return response.blob().then(function (blob)
{
return new serviceWorker.Response(blob, init);
});
});
onCacheMatch函数(cachedResponse,请求) { var durationInHeader = cachedResponse.headers.get(“ x-sw-cache-timestamp”);
if (durationInHeader > (Date.now() - 600000))
{
fetch(request);
return cachedResponse;
}
return fetch(request); }
希望这会有所帮助!
答案 2 :(得分:0)
您可以动态创建用于编码其创建时间和最长期限的缓存名称,类似于:${dateStr}_${maxAgeMs}
。然后,当在服务工作者中拦截提取时,您可以使用caches.keys
浏览现有的缓存,并仅使用其名称查找尚未过期的缓存并与之匹配,或者如果它们都已过期则创建一个新的缓存并用传入的提取信息填充它。这也使您有机会删除过期的缓存。
我也需要这样做,并查看了提到的工作箱项目,似乎他们在使用IndexedDB存储做类似的事情,但是对于要求太高了。