桌面端SVG正常,移动端Safari仅隐私模式渲染正常问题咨询
这问题我之前帮好几个开发者排查过,Safari普通模式和隐私模式的SVG渲染差异,大概率是下面这些因素在搞鬼:
本地存储依赖导致的逻辑异常
如果你的SVG渲染逻辑(比如动态修改SVG颜色、尺寸的JS代码)依赖读取localStorage或sessionStorage里的数据,普通模式下存储可能残留了旧的、错误的配置值,导致渲染流程出错;而隐私模式下本地存储是空的,代码会走默认的正常逻辑,SVG自然能显示。我碰到过一个案例,就是用户之前测试时存了个非法的颜色值,普通模式一直读这个错误值,隐私模式就正常。缓存资源损坏或过期
普通模式下Safari会缓存SVG文件、关联的CSS样式或JS脚本,如果缓存的资源损坏(比如传输中断导致文件不完整)或者是带有bug的旧版本,就会导致渲染失败;而隐私模式下浏览器不会使用本地缓存,会直接从服务器拉取最新的正常资源,所以显示正常。这种情况在频繁迭代的项目里特别常见。浏览器扩展的拦截干扰
普通模式下用户可能安装了广告拦截、隐私保护类的浏览器扩展,这些扩展有时候会误把SVG(尤其是带有特定命名或来自第三方域名的SVG)识别为广告或跟踪资源,直接拦截加载;而隐私模式下大部分扩展默认是禁用的,没有了拦截,SVG就能正常渲染。ITP(智能跟踪预防)的跨域资源限制
Safari的ITP在普通模式下会严格限制跨域资源的加载,如果你的SVG引用了跨域的字体、图片或者滤镜资源,或者SVG本身是从第三方域名加载且没有正确配置CORS响应头,ITP可能会阻止这些资源加载,导致SVG渲染异常;而隐私模式下ITP的某些跨域规则可能有不同的执行逻辑,使得资源能正常加载。CSP(内容安全策略)的差异化执行
如果你的网站设置了严格的CSP规则,普通模式下浏览器会严格执行(比如禁止inline SVG、限制资源加载域名),可能不小心阻止了SVG的正常渲染;而隐私模式下某些CSP规则可能被浏览器放松执行,或者你在隐私模式下测试时临时调整过CSP配置,导致SVG能正常显示。SVG内部的动态内容被限制
如果你的SVG里包含<script>标签或者依赖JS动态修改内容,普通模式下Safari的安全策略(比如ITP或CSP)可能阻止了脚本执行,导致SVG无法正常渲染;而隐私模式下脚本执行的限制相对宽松,或者没有缓存的旧脚本干扰,所以能正常显示。
内容的提问来源于stack exchange,提问作者Johnny Rockex

