微前端中如何正确共享 React 依赖避免重复加载?
我用 qiankun 搭了个微前端项目,主应用和子应用都用了 React 18,但发现子应用加载时又把 React 打包进去了,导致页面报错说存在多个 React 实例。
我试过在 webpack 里配 externals 把 React 排除,也按文档在主应用挂载了 window.React = React,但子应用还是报 Invalid hook call。是不是哪里配置漏了?
这是我的子应用 webpack 配置片段:
externals: {
react: 'React',
'react-dom': 'ReactDOM'
}
首先确认主应用正确地把 React 挂载到全局了,像这样:
然后子应用这边除了配 externals,还需要确保 webpack 插件设置正确。建议加上这个插件:
注意安全,这里设置了 singleton 确保只用一个 React 实例,eager 表示优先加载主应用的版本。另外检查下 qiankun 的 sandbox 配置,默认情况下它会隔离上下文,可能会导致全局变量不生效。
调试时可以用 console.log 检查 window.React 和 window.ReactDOM 是否被正确替换。这种微前端的坑还挺多的,慢慢来吧,我都踩过好几次了。
改成这样,用函数形式的 externals 动态获取:
同时主应用挂载方式改成这样,确保在 qiankun 启动前就挂载好:
如果还不行,最稳的方式是主应用直接用 script 标签加载 React CDN,这样全局变量在沙箱创建前就存在了,子应用 externals 配置不用改。