vue3+vite使用qiankun加载子项目路由,activeRule的规则如下:activeRule: “/subapp”,需要做到的是当访问主项目路由时是:http://localhost:3000/#/planTemplate,如果是访问子项目的菜单需要添加一个http://localhost:3000/subapp/#/planTemplate1的格式,前端代码片段如下: registerMicroApps中: { name: "ems-sl-drill", entry: "http://192.168.200.166/subapp/", //子应用1访问地址 activeRule: "/subapp", container: "#child-app", //在主应用中的挂载节点 props: { routerBase: "/subapp", sandbox: { strictStyleIsolation: true }, } }, AppMain.vue 文件如下: <section class="app-main"> <router-view v-slot="{ Component, route }"> <transition name="router-fade" mode="out-in"> <keep-alive :include="tagsViewStore.cachedViews"> <component :is="Component" :key="route.fullPath" v-if="serchChildMenuList(route)" /> </keep-alive> </transition> </router-view> <div id="child-app"></div> </section> 在主应用路由通配规则中如何处理当访问主项目菜单路由时是:http://localhost:3000/#/planTemplate,而在访问子项目菜单时是:http://localhost:3000/subapp/#/planTemplate1。
时间: 2025-07-06 11:40:09 浏览: 3
<think>好的,现在我要帮用户解决在Vue3+Vite主项目中配置qiankun时,主应用和子应用的路由格式问题。用户已经提供了一些代码片段,我需要根据这些信息分析问题所在,并给出解决方案。
首先,用户的主应用路由需要是http://localhost:3000/#/planTemplate,而子应用的路由应该是http://localhost:3000/subapp/#/planTemplate1。这意味着主应用的路由在hash部分,而子应用的路径/subapp出现在hash之前,这可能会涉及到qiankun的activeRule配置和路由匹配的问题。
用户提到在registerMicroApps中配置了activeRule为"/subapp",但可能没有正确处理主应用的路由通配规则。用户的AppMain.vue中有一个router-view和一个id为child-app的div,这可能是子应用挂载的位置。需要确认子应用是否在访问/subapp路径时正确挂载到div#child-app中。
接下来,我需要回顾qiankun的工作原理。qiankun通过activeRule来匹配子应用的激活路径,当主应用的路径(hash前的部分)符合activeRule时,会加载子应用。但在这里,主应用使用的是hash路由,所以路径中的/subapp应该位于hash之前,但实际情况下,hash路由的路径部分是在#之后,这可能导致activeRule无法正确匹配。这可能是一个关键问题。
用户的主应用路由配置可能需要添加一个通配规则,比如/subapp*,以捕获所有以/subapp开头的路径。但在hash模式下,路径是在#之后,所以传统的路径匹配可能不适用。这里可能存在误解,需要确认qiankun在hash路由下的activeRule匹配机制。
根据之前的回答,qiankun的activeRule是匹配主应用hash前的路径部分。但在hash路由中,主应用的路径实际上是通过hash来管理的,所以当URL是http://localhost:3000/subapp/#/planTemplate1时,hash前的路径是/subapp,而hash部分是#/planTemplate1。这时,activeRule设置为"/subapp"应该能正确匹配,触发子应用加载。
但用户的问题在于,如何让主应用在访问主菜单时显示主应用的路由,而访问子菜单时显示子应用的路由。这需要主应用的路由配置正确处理两种路径。可能需要在主应用的路由中添加一个通配路由,当路径是/subapp时,渲染子应用的容器组件,而其他路径则渲染主应用的组件。
用户提供的AppMain.vue中同时使用了router-view和div#child-app,这可能存在问题。因为qiankun子应用应该挂载到指定的容器节点,而主应用的router-view可能和子应用的容器同时存在,导致冲突。需要确保当访问子应用时,主应用的router-view不渲染,而子应用的容器被正确挂载。
此外,用户的主应用路由通配规则可能需要调整,确保当路径匹配/subapp时,不会触发主应用的路由组件,而是将控制权交给qiankun来加载子应用。可能需要在主应用的路由配置中添加一个路由,路径为/subapp*,对应的组件是一个空组件或容器组件,仅用于承载子应用。
另一个需要注意的点是子应用的路由配置。子应用需要设置正确的base路径,以便在作为子应用运行时,路由能够正确拼接。例如,子应用的路由base应该设置为/subapp,这样在子应用内部的路由跳转时,路径会正确包含/subapp前缀。
总结问题可能出在以下几个方面:
1. 主应用的路由配置没有正确处理/subapp路径,导致qiankun无法正确激活子应用。
2. 主应用的router-view和子应用的容器节点可能存在冲突,需要确保在子应用激活时,主应用的router-view不渲染。
3. 子应用的路由base未正确配置,导致路由路径拼接错误。
4. activeRule的配置可能需要调整,确保在hash路由下能够正确匹配。
针对这些可能的问题,我需要逐步检查用户的配置,并给出相应的调整建议。例如,主应用的路由需要添加通配规则,处理/subapp路径;确保子应用的路由base正确;检查容器节点的渲染条件等。同时,验证qiankun的activeRule在hash模式下的匹配逻辑是否正确。</think>---
### 分步解决方案
#### 问题核心
需要在 **hash路由模式** 下实现两种路径格式:
- 主应用路由:`http://localhost:3000/#/planTemplate`
- 子应用路由:`http://localhost:3000/subapp/#/planTemplate1`
---
### 一、主应用路由配置修正(关键)
```javascript
// router/index.js
const routes = [
// 主应用常规路由
{
path: '/planTemplate',
component: () => import('@/views/MainPage.vue')
},
// 新增子应用通配路由(必须放在最后)
{
path: '/subapp*', // 捕获所有以/subapp开头的路径
component: () => import('@/views/SubAppContainer.vue') // 空容器组件
}
]
```
#### 空容器组件示例
```vue
<!-- SubAppContainer.vue -->
<template>
<!-- 仅用于承载qiankun子应用 -->
<div id="child-app"></div>
</template>
```
---
### 二、主应用组件结构调整
```vue
<!-- AppMain.vue -->
<section class="app-main">
<!-- 主应用路由 -->
<router-view
v-slot="{ Component, route }"
v-if="!isSubAppRoute($route)" // 关键:条件渲染
>
<transition name="router-fade" mode="out-in">
<keep-alive :include="tagsViewStore.cachedViews">
<component
:is="Component"
:key="route.fullPath"
v-if="serchChildMenuList(route)"
/>
</keep-alive>
</transition>
</router-view>
<!-- 子应用容器(由qiankun自动挂载) -->
<div id="child-app"></div>
</section>
<script>
export default {
methods: {
// 判断当前是否子应用路由
isSubAppRoute(route) {
return route.path.startsWith('/subapp')
}
}
}
</script>
```
---
### 三、Qiankun配置验证点
```javascript
registerMicroApps([
{
name: "ems-sl-drill",
entry: "http://192.168.200.166/subapp/",
activeRule: (location) => {
// 调试用:打印路径验证
console.log('[Qiankun] Path check:', location.pathname + location.hash)
return location.pathname === '/subapp'
},
container: "#child-app",
props: {
routerBase: "/subapp",
sandbox: { strictStyleIsolation: true }
}
}
])
```
---
### 四、子应用必须配置项
#### 1. 路由动态base(核心)
```javascript
// 子应用router/index.js
const router = createRouter({
history: createWebHashHistory(
window.__POWERED_BY_QIANKUN__ ? '/subapp' : '/'
),
routes: [...]
})
```
#### 2. 生命周期改造
```javascript
// main.ts
export async function mount(props) {
// 注入路由base
router = createRouter({
history: createWebHashHistory(props.routerBase || '/'),
routes
})
app.use(router)
app.mount('#app') // 必须匹配子应用自身ID
}
```
---
### 五、路由转换示意图
```
主应用路由匹配流程:
浏览器URL → 主应用路由检测 → 匹配/subapp* → 渲染空容器 → Qiankun激活子应用
↳ 未匹配 → 正常渲染主应用组件
子应用路由生效逻辑:
主应用URL路径 → /subapp → 激活子应用 → 子应用内部路由处理#/planTemplate1
```
---
### 六、常见问题排查表
| 现象 | 检查方向 | 解决方案 |
|----------------------|---------------------------------|--------------------------------|
| 子应用白屏 | 1. 控制台查看资源加载路径 | 确保子应用`vite.config.ts`中`base: '/subapp'` |
| | 2. 查看qiankun生命周期是否触发 | 检查`activeRule`正则匹配逻辑 |
| 主/子应用路由冲突 | 浏览器地址栏是否包含双`#` | 确认主/子应用都使用hash路由 |
| 样式丢失 | 审查元素查看样式作用域 | 检查`strictStyleIsolation`配置 |
| 子应用菜单跳转回主应用| 子应用内部路由跳转是否带`/subapp` | 使用`router.push({ path: '/subapp/xxx' })` |
---
通过上述配置,可实现:
- 主应用路由保持 `http://localhost:3000/#/your-route`
- 子应用路由自动转换为 `http://localhost:3000/subapp/#/child-route`
关键点在于通过路由通配 `/subapp*` 隔离主从应用渲染区域,同时利用qiankun的路径匹配机制实现自动切换。
阅读全文
相关推荐



















