用户清了一次网站数据,之后再进来主题变回浅色,但系统是暗色,页面和系统对不上,iOS 上尤其明显。乍看像缓存或者权限的锅,追下去往往不是。

let saved = null;
try { saved = localStorage.getItem('theme'); } catch (e) {}
const theme = saved || (matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');

追下去是这么回事:主题只存在 localStorage,清数据后读不到值就默认浅色,没有回退到系统偏好。无痕模式下读写还会直接抛异常。

「主题偏好丢失」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。别只看报错的最后一行,往上看几行,真正的起因通常在上面。

同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

具体做法是,读取失败或为空时回退到 prefers-color-scheme;读写包一层 try/catch 兼容无痕模式;清空站点数据后重新打开 确认跟随系统。

验收就看一点,清空网站数据后打开页面,主题跟系统一致。

作者 9823189