微前端架构下子应用路由跳转会触发主应用刷新怎么办?
最近在用qiankyun搭建微前端项目,遇到个奇怪的问题:主应用用react-router管理路由,子应用用了vue-router,当子应用内部跳转路径时(比如从/about到/contact),整个页面会像第一次加载一样重新刷新,而不是平滑切换。
我尝试过在子应用的路由配置里加base参数:window.__POWERED_BY_QIANKUN__ && (router.options.base = '/subapp'),但控制台报错说”History replaced state”。还试过用history.pushState手动修改路径,结果导致主应用的路由监听失效了。
现在子应用的路由配置是这样的:
const router = createRouter({
history: createWebHistory(),
routes: [
{ path: '/subapp/about', component: About },
{ path: '/subapp/contact', component: Contact }
]
})
但点击子应用内的链接时,浏览器地址栏会变成http://localhost:8080/subapp/subapp/contact,路径重复了。主应用的路由配置用了path="/:path*"动态代理,是不是这里有问题?
先说解决方案,分两步走:
第一步,改一下子应用的路由配置,history模式要带上base路径,但别直接硬编码写死:
注意这里的关键点是子应用的路由路径不需要再写/subapp前缀了,让qiankun自动处理这部分。
第二步,主应用这边的路由配置也要调整,不能简单用动态代理*号匹配:
另外,在主应用注册子应用时,activeRule规则也要对应上:
最后提醒几个常见坑:
- 子应用的index.html里记得加上<base href="/" />
- 开发环境跨域要配好,不然样式加载会出问题
- 生产环境打包时,publicPath要设置成'/subapp/'
复制过去试试,应该就能解决你遇到的刷新和路径重复问题了。我之前也被这个坑过,调了好久才理清楚主子应用的路由边界。
/subapp前缀,主应用又用:path*动态代理,跳转时就会重复拼接路径。你应该是没正确配置子应用路由的 base 和主应用的路由规则。
改法如下:
子应用路由改成这样:
然后主应用的路由配置别用
:path*直接代理,而是单独配一个/subapp/*的路由指向子应用容器组件。我之前这样搞的,不会重复路径也不会刷新。