React Native fetch() API缓存支持及304状态未返回问题咨询
嘿,我之前也碰到过类似的缓存困惑,咱们一步步拆解你的问题:
首先得明确fetch(uri, { cache: 'default' })的预期行为:它会优先使用浏览器本地的HTTP缓存,如果缓存还在max-age有效期内,直接读取缓存不发请求;如果缓存过期,会自动带上If-Modified-Since或If-None-Match请求头发条件请求,服务器验证资源未修改后返回304。你现在每次都拿到200,说明要么浏览器没缓存响应,要么条件请求没触发,或者服务器没正确处理条件请求。
结合你提到的Cloudflare环境,下面是几个关键排查点:
检查浏览器是否真的缓存了响应
打开浏览器开发者工具的Network面板,先确保没勾选「Disable cache」,然后连续两次请求同一URI:- 看第二次请求的请求头里有没有
If-Modified-Since或If-None-Match?如果没有,说明浏览器根本没把第一次的响应存入缓存。 - 可能的原因:服务器返回的响应里有没有
Set-Cookie头?默认情况下,浏览器不会缓存带Set-Cookie的响应,除非cache-control明确加上public;另外如果有Vary头,且每次请求的Vary指定的请求头(比如Accept-Encoding)不一致,也会导致缓存不命中。
- 看第二次请求的请求头里有没有
确认Cloudflare返回的响应头是否包含ETag/Last-Modified
Cloudflare的cf-cache-status: HIT只是说明CDN层命中了缓存,但浏览器要发条件请求,必须依赖服务器返回的ETag或Last-Modified头。你可以在Network面板里查看第一次请求的响应头,有没有这两个字段?如果没有,就算max-age设置了1天,缓存过期后浏览器也没法发条件请求,只能重新获取完整资源(200)。
这种情况下,你需要检查源服务器的配置,确保它返回ETag或Last-Modified,同时确认Cloudflare没有移除这些头(Cloudflare默认会保留,但某些缓存规则可能会修改)。排查fetch缓存模式的实际生效情况
试试把缓存模式改成force-cache:fetch(uri, { cache: 'force-cache' }),如果这次直接读取缓存不发请求,说明之前default模式下浏览器认为缓存已经过期?那你要检查浏览器本地时间和服务器时间是否有较大偏差,导致max-age的有效期计算错误。另外,也要确认页面本身有没有设置no-cache的meta标签,或者有没有Service Worker拦截了请求并绕过了缓存。用curl验证服务器端的条件请求支持
复制第一次请求返回的Last-Modified值,然后用curl模拟条件请求:curl -v -H "If-Modified-Since: 你的Last-Modified值" https://目标URI如果curl能拿到304,说明服务器端(包括Cloudflare)是支持条件请求的,问题出在浏览器或fetch的配置上;如果curl也返回200,那说明服务器/Cloudflare的配置有问题,比如没有正确处理条件请求头。
最后补充一点:Cloudflare的缓存和浏览器缓存是两层独立的缓存,CDN返回HIT只是说明CDN给你返回了缓存的资源,但浏览器是否使用本地缓存,完全看CDN返回给浏览器的响应头是否符合HTTP缓存规则。
内容的提问来源于stack exchange,提问作者Lawrence I. Siden




