useSWR在Firefox和Safari中无法正常工作(Next.js应用)
遇到这种跨浏览器的请求差异问题确实挺闹心的,我帮你梳理几个常见的排查方向和解决办法:
缓存策略的浏览器差异:useSWR默认会利用浏览器缓存,而Firefox和Safari对缓存的处理逻辑和Chrome略有不同。你可以尝试在fetch函数里显式设置缓存策略,强制跳过缓存直接发起请求:
const fetcher = async (url) => { const res = await fetch(url, { cache: 'no-store' }); if (!res.ok) throw new Error('请求失败'); return res.json(); };浏览器隐私防护拦截:Firefox的增强跟踪保护、Safari的智能防跟踪功能,可能会拦截带有特定特征的请求(比如跨域请求、包含第三方标识的请求)。你可以先临时关闭浏览器的隐私防护功能测试一下,如果请求能正常发送了,就得调整后端的CORS配置,确保响应头包含正确的
Access-Control-Allow-Origin等字段,同时检查请求头里有没有违反浏览器隐私规则的内容。useSWR的启用配置问题:检查一下你的useSWR调用有没有设置
enabled: false或者revalidateOnMount: false这类选项,这些配置可能会导致在某些浏览器环境下请求不触发。确保你的调用是这样的:const { data, error } = useSWR('/api/user-items', fetcher, { revalidateOnMount: true, enabled: true, });Next.js组件类型影响:如果你的组件是静态生成的服务端组件,可能在Firefox/Safari里不会触发客户端的useSWR请求。可以给组件加上
'use client'指令,将其转为客户端组件,确保useSWR能在客户端正常执行。请求URL的兼容性问题:检查请求URL里是否包含特殊字符,有些字符在Chrome里能正常解析,但在Firefox/Safari里会被拦截。如果有动态参数,记得用
encodeURIComponent处理一下,避免URL解析异常。
备注:内容来源于stack exchange,提问作者mack1ch

