qiankun官方demo用的是history方式的路由,我们知道history需要后端配合,否则线上环境刷新会404。那么今天我们就研究下如何将主应用改为hash模式。
关于路由
1.存在问题
在采用 hash 路由模式的话,主应用路由会有 /#/
的前缀,比如主应用的 resource 组件路由:
1 | http://localhost:8889/#/resource |
假设 history 路由模式下子应用的注册信息为:
1 | { |
此时 qiankun 只有命中 url 为http://localhost:8889/live
才会加载子应用。
此处假设使用的路由切换代码为:
1 | this.$router.push({ |
那么现在切换的 url 是 http://localhost:8889/#/live
,显然不能匹配 /live
,所以加载子应用失败。我们需要修改一下子应用注册的 activeRule
,使得匹配 hash 路由模式。
2.解决方案
为了区分开主应用的自身模块与子应用的路由区别,子应用的路由增加 /micro
前缀,比如 /micro/live
是子应用的路由。
那么 hash 路由模式下子应用的注册信息变成:
1 | { |
路由切换代码修改为:
1 | this.$router.push({ |
这样的话,主应用路由切换后的 url 就能命中子应用的 activeRule 了。
同时,子应用也需要将路由模式设置为 hash 模式,否则,会出现在子应用切换自身路由时,改变主应用 hash 路由的情况。比如子应用切换自身路由 /about
,此时 url 会变成 http://localhost:8889/about/#/micro/live
,导致路由命中失败。我们期望的 url 是 http://localhost:8889/#/micro/live/about
。
所以,为了兼容主应用的 hash 模式路由,子应用也需要设置为 hash 模式的路由,最终结果是实现子应用路由与子应用注册在主应用的 activeRule 的一致性。
下面会分别对主应用与子应用进行配置。
配置子应用
子应用是常规 vue 项目,需要做调整的的是路由配置文件 /router.index.js
以及入口文件 main.js
。
1.路由增加前缀
1 | // router/index.js |
2. 在路由跳转前添加前缀,保证和router中配置的path匹配上
1 | // main.js |
配置主应用
1. 修改注册微应用时的路由匹配规则
因为主应用采用的是 hash 路由模式,qiankun 需要命中路由的话,activeRule 需要带上 /#/
前缀。
1 | // App.vue |
2.增加路由
使得主应用对于/micrApp/dev
和/micrApp/dev/about
匹配到的是同一个路由组件。
1 | // router/index.js |
现在,当url变化时,首先会进入qiankun的匹配规则中,匹配到 /#/micro/live
时,会加载微应用到节点。同时,主应用的vue-router匹配到/micrApp/live
路由后会跳转到对应的路由组件;然后微应用的vue-router匹配后会展示相应的微应用路由。
当微应用内部的<router-link to="/about">
被点击时,首先微应用跳转路由前会加上/micro/live
前缀,所以就是往 /micro/live/about
跳转,匹配到about路由;然后在主应用的vue-router中匹配到 /micro/live/:microRoute
路由,保持主应用路由为同一个路由组件。