umi +qiankun 主应用动态装载子应用(路由)解决方案

本文介绍了如何在umi + qiankun框架下实现主应用动态装载子应用的路由。通过删除配置文件中写死的子应用路由,添加子应用容器,以及创建动态装载子应用路由的文件,实现了根据用户权限动态加载不同路由的功能。参考了官方文档和GitHub上的相关代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

umi +qiankun 主应用动态装载子应用(路由)解决方案

前言

接上一篇(https://www.yuque.com/blueju/blog/gtgndg),上一篇中使用的都是运行时动态注册子应用,子应用路由仍然是写死的、非动态获取。


然后真实项目中除了需要动态注册子应用,还很有可能需要动态装载子应用(路由),比如说:不同权限的用户需要给予他们不同的路由。


此篇 blog 的代码是基于上一篇进行改动的,上一篇 blog 中的代码对应的 GitHub 地址是:https://github.com/blueju/umi-mirror-docs/tree/runtime-dynamic-register-sub-app

子应用

为了体现出现演示效果,我们先为子应用添加两个新页面和新路由,如下图:

路由代码

image.png

页面代码
copy 自 pages/index.tsx

image.png

主应用

根据官网文档:

我们知道,动态装载子应用(路由)的方式有两种,


在这里,我可以明确地告诉大家,截止目前(2020年9月6日17点51分),动态装载子应用(路由)无法使用第一种方式(在 config/config.ts 中配置路由)。
image.png

删除之前写死的子应用(路由)装载

在 config/config.ts 中删除之前写的以下子应用(路由)装载配置:

{
  name: 'sub-app-1',
  icon: 'smile',
  path: '/sub-app-1',
  microApp: 'sub-app-1',
},

添加子应用路由配置(Mock)

https://github.com/blueju/umi-docs/commit/5f330d5233ebe566c8e4f8c1cc1749e2b4cdcfdf

添加子应用容器

https://github.com/blueju/umi-docs/commit/849d9f3dbe930a092938334e66d51568ed873fe3
在 src/layouts 下新建一个叫 MicroAppLayout.tsx 的文件

import { MicroApp } from 'umi';
import React from 'react';

function MicroAppLayout() {
  return <MicroApp name="sub-app-1" />;
}

export default MicroAppLayout;

动态装载子应用路由

在 src/app.tsx 下新建 app.tsx 文件,代码为:

import { dynamic } from 'umi';
import LoadingComponent from '@/components/PageLoading';

let extraRoutes: object[] = [];

export const qiankun = fetch('/api/config')
  .then((res) => {
    return res.json();
  })
  .then(({ apps }) => {
    return Promise.resolve({
      // 注册子应用信息
      apps,
      // 完整生命周期钩子请看 https://qiankun.umijs.org/zh/api/#registermicroapps-apps-lifecycles
      lifeCycles: {
        afterMount: (props) => {
          console.log(props);
        },
      },
      // 支持更多的其他配置,详细看这里 https://qiankun.umijs.org/zh/api/#start-opts
    });
  });

export function patchRoutes({ routes }) {
  extraRoutes.forEach((element) => {
    routes[1].routes[0].routes.unshift({
      name: element.name,
      icon: 'smile',
      path: element.path,
      component: dynamic({
        loader: () =>
          import(/* webpackChunkName: 'layouts__MicroAppLayout' */ '@/layouts/MicroAppLayout'),
        loading: LoadingComponent,
      }),
    });
  });
}

export async function render(oldRender) {
  fetch('/api/config')
    .then((res) => {
      return res.json();
    })
    .then((resJson) => {
      extraRoutes = resJson.routes;
      oldRender();
    });
}

Github

https://github.com/blueju/umi-docs/tree/runtime-dynamic-load-sub-app-router


参考:
https://github.com/ant-design/ant-design-pro/issues/5909
如何从服务端获取菜单数据及权限校验
umi 运行时配置
Antd Design Pro 中如何动态获取路由替换掉config/route.config.js
antd pro 动态菜单与动态路由
是否真的不支持动态路由
[Feature Request] 微前端框架下动态增加微前端路由
运行时配置:patchRoutes动态添加多级路由,子路由没效果。
https://github.com/umijs/umi/issues/5003

### React 与 Qiankun 微前端框架的集成 Qiankun 是一个用于构建微前端架构的强大工具,能够轻松实现不同技术栈之间的无缝协作。对于希望将现有 React 应用程序作为独立模块嵌入到更大规模的应用生态系统中的开发者来说,Qiankun 提供了一个简单而高效的解决方案[^4]。 #### 基本概念 在开始之前,理解几个核心概念非常重要: - **主应用 (Host)**: 负责加载并管理多个子应用程序的行为。 - **子应用 (Micro App)**: 可以被其他应用程序动态加载的小型Web应用;可以由不同的团队维护,并采用各自的技术栈开发。 当涉及到React项目时,主要工作集中在如何让这些组件能够在不干扰彼此的情况下共存于同一个页面上,同时保持各自的路由、状态管理和样式作用域等特性[^1]。 #### 集成步骤 为了使React成为Qiankun体系内的有效组成部分,需遵循如下指南完成必要的设置操作: ##### 主应用配置 安装依赖项: ```bash npm install qiankun --save ``` 修改`src/main.tsx`来注册子应用实例: ```typescript import { registerMicroApps, start } from 'qiankun'; // 注册子应用 registerMicroApps([ { name: 'react-app', // 子应用名称 entry: '//localhost:7101', // 子应用地址 container: '#subapp-container', // 容器节点的选择器或DOM对象,默认是body下的div#root activeRule: '/react' // 激活规则,即访问该路径时会加载子应用 } ]); start(); // 启动qiankun ``` ##### 子应用适配 确保子应用已正确设置了生命周期函数以便更好地融入整体环境之中。编辑`public/index.html`文件,在<body>标签内添加容器元素: ```html <div id="root"></div> <script src="/umi.js"></script> <!-- 如果不是使用 umi 构建,则可能是 react 的 bundle 文件 --> ``` 接着调整`src/app.tsx`里的内容结构使其适应新的运行模式: ```typescript import React from 'react'; import ReactDOM from 'react-dom/client'; import './index.css'; import App from './App'; import reportWebVitals from './reportWebVitals'; import { lifecycle } from 'qiankun'; const render = () => { const rootElement = document.getElementById('root'); if (!rootElement) throw new Error('Failed to find the root element'); const client = ReactDOM.createRoot(rootElement); client.render( <React.StrictMode> <App /> </React.StrictMode>, ); }; if (!window.__POWERED_BY_QIANKUN__) { render(); } lifecycle({ bootstrap:async ()=>{ console.log('[react app] react app bootstraped'); }, mount:async props=>{ console.log('[react app] props from main framework',props); render(props); }, unmount:()=>{ console.log('[react app] before app unmount,do something...'); } }); ``` 上述代码片段展示了如何通过监听特定事件(如启动、装载和卸载)来自定义行为,从而增强用户体验的一致性和稳定性[^5]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值