新的工人功能(额外 5 美元)可以促进这一点:
要点:
Cloudflare 通常将普通静态文件视为几乎永不过期(或者可能是一个月 - 我完全忘记了)。
所以一开始你可能会想"I just want to add .json to the list of static extensions"
。这可能不希望您使用 JSON - 除非它真的很少更改 - 或者按文件名进行版本控制。您可能需要 60 秒或 5 分钟,这样如果您更新文件,它将在这段时间内更新,但您的服务器不会受到来自每个最终用户的单独请求的轰炸。
以下是我与工作人员一起拦截所有.json
扩展文件的方法:
// Note: there could be tiny cut and paste bugs in here - please fix if you find!
addEventListener('fetch', event => {
event.respondWith(handleRequest(event));
});
async function handleRequest(event)
{
let request = event.request;
let ttl = undefined;
let cache = caches.default;
let url = new URL(event.request.url);
let shouldCache = false;
// cache JSON files with custom max age
if (url.pathname.endsWith('.json'))
{
shouldCache = true;
ttl = 60;
}
// look in cache for existing item
let response = await cache.match(request);
if (!response)
{
// fetch URL
response = await fetch(request);
// if the resource should be cached then put it in cache using the cache key
if (shouldCache)
{
// clone response to be able to edit headers
response = new Response(response.body, response);
if (ttl)
{
// https://developers.cloudflare.com/workers/recipes/vcl-conversion/controlling-the-cache/
response.headers.append('Cache-Control', 'max-age=' + ttl);
}
// put into cache (need to clone again)
event.waitUntil(cache.put(request, response.clone()));
}
return response;
}
else {
return response;
}
}
您可以使用 mime-type 而不是扩展名来执行此操作——但这会非常危险,因为您最终可能会过度缓存 API 响应。
此外,如果您按文件名进行版本控制 - 例如。products-1.json
/products-2.json
那么你就不需要设置max-age
过期的标头了。