用户在系统设置里切到深色,浏览器其他站点立即变暗,自己这个站毫无反应,必须手动刷新。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
const mq = matchMedia('(prefers-color-scheme: dark)');
mq.addEventListener('change', e => {
if (!localStorage.getItem('theme')) apply(e.matches ? 'dark' : 'light');
});
首屏只读了一次 prefers-color-scheme 的结果,没有订阅变化事件。系统主题切换不会触发页面重载。这一点先确认清楚,后面就不用反复试。
「matchMedia 监听」这类改动最怕改一半,回滚脚本先准备好,再动生产。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
具体做法是,用 matchMedia 监听 prefers-color-scheme 的变化;回调里先判断用户是否手动选过主题 手动优先;改完系统主题 观察页面是否在 1 秒内跟随。
改完照着核一遍,系统切换深浅色后页面立即跟随,手动选过的用户保持原选择。
