微前端子应用间如何避免缓存数据互相污染?
在使用qianky微前端架构时,遇到两个子应用都用了localStorage缓存用户信息,但登录状态会互相覆盖。比如主应用登录后,子应用的用户信息却显示为空:
const UserContext = React.createContext();
function UserProvider({ children }) {
const [user, setUser] = useState(() => {
const cachedUser = localStorage.getItem('user');
return cachedUser ? JSON.parse(cachedUser) : null;
});
useEffect(() => {
localStorage.setItem('user', JSON.stringify(user));
}, [user]);
return (
<UserContext.Provider value={{ user, setUser }}>
{children}
</UserContext.Provider>
);
}
我已经尝试在key名前加应用标识变成”app1_user”,但发现子应用卸载时未清理缓存,导致旧数据残留。有没有更优雅的方案既能共享缓存又避免冲突?
更稳的做法是结合子应用的 mount/unmount 钩子来做缓存封装。qiankui 提供了全局的生命周期,你可以在子应用挂载时读取自己的命名空间数据,卸载时选择性清掉当前应用相关的 localStorage 项。
比如改造你的 UserProvider:
然后在子应用导出的 lifecycle 中处理:
如果你还想进一步控制共享粒度,比如某些基础信息(用户ID、token)可以主应用统一写,子应用只读,那就干脆把用户状态提到主应用通过 props 传下来,或者用 qiankui 的 globalState 机制做通信,而不是各自去碰 localStorage。
说白了,localStorage 本身是全局的,想避免污染就得要么严格分区 + 清理,要么干脆不用它存多实例数据。我之前也踩过这坑,看着简单,实际得把缓存生命周期和子应用绑定死才靠谱。
localStorage存储数据确实容易导致冲突,而且子应用卸载时清理不干净也是个麻烦事。最优雅的方案是通过主应用统一管理共享状态,子应用只负责向主应用注册和获取数据。这样可以避免子应用之间互相污染,也方便主应用统一控制缓存生命周期。
具体实现可以参考以下代码:
这种做法符合微前端的最佳实践,主应用作为单一可信源,子应用只负责局部状态管理。同时在子应用卸载时自动清理相关数据,避免残留问题。
另外提醒一下,
localStorage只适合存储非敏感信息,涉及到登录态这类重要数据,建议使用sessionStorage或者 Cookie 配合后端校验会更安全。这是标准写法,也是官方文档推荐的方式。