Umi + qiankun 实现动态加载子应用路由

2022-05-10  本文已影响0人  恪晨

前言

  最近在做项目重构的事情,原来的一个Vue项目有几十个菜单,项目大的令人发指,所以准备重构,使用了umi+qiankun的方式,子应用使用了vue和react两个类型的框架。

需求

  因为用到了umi框架,默认的路由文件统一配置在config/routers下面,并且是静态的,但是因为现在是动态添加的子应用,如果使用静态的路由文件,每次新加一个子应用,就需要修改一次主应用中的路由文件再发布一次,明显感觉不合理。因此找了一个解决动态路由的方法,也是官方的解决方案。配置的方式主要是在运行时进行,官方文件见https://umijs.org/zh-CN/docs/runtime-config

配置

// 后面需要使用
let globalApp: any[] = [];
// 获取微应用信息列表
export const qiankun = getApps().then((data) => {
    const apps = data?.DATA.filter((i: { entry: any }) => i.entry) || [];

    const tmp = apps?.map((app: any) => {
        return {
            ...app,
            // 增加一些子应用需要用到变量
            props: {
                globalState: {
                    ...initState,
                },
            },
        };
    });
    globalApp = tmp;
    return {
        apps: tmp,
    };
});

// 返回的数据结构
const response = [
    {
        enrty: 'https://10.10.10.10:111',
        name: 'microApp1'
    },
    {
        enrty: 'https://10.10.10.10:222',
        name: 'microApp2'
    }
];
let extraRoutes: object[] = [];
export function patchRoutes({ routes }: any) {
    extraRoutes.forEach((element: any) => {
        routes[0].routes[2].routes[0].routes.unshift({
            name: element.name,
            path: element.path,
            component: dynamic({
                loader: () =>
                    import(
                        /* webpackChunkName: 'layouts__MicroAppLayout' */ '@/layouts/MicroAppLayout'
                    ),
                loading: LoadingComponent,
            }),
        });
    });
}
import React from 'react';
import { MicroApp } from 'umi';

const MicroAppLayout: React.FC = (props: any) => {
    return (
        <>
            <MicroApp name={props?.route?.name} />
        </>
    );
};
export default MicroAppLayout;
export function render(oldRender: () => void) {
    extraRoutes = globalApp?.map((app: any) => {
        return {
            name: app.name,
            path: '/' + app.name,
        };
    });
    oldRender();
}

总结

  通过以上的方式,我们就能根据后端的返回接口,动态的添加路由了,本地的路由配置文件只需要配置一些主应用常用的并且几乎不会变化的路由即可。当然不光是微应用可以使用这种方式,如果有需要的话普通的路由也可以使用这种方式进行配置,这也就省去了我们每次新加一个菜单就要更新一遍routers文件的问题。

参考

https://blog.csdn.net/BLUE_JU/article/details/109467321

上一篇 下一篇

猜你喜欢

热点阅读