antd-design-pro项目引用微前端,使用qiankun实现动态路由加载

官网:微前端的核心目标是将巨石应用拆解成若干可以自治的松耦合微应用,而 qiankun 的诸多设计均是秉持这一原则,如 HTML entry、沙箱、应用间通信等。这样才能确保微应用真正具备 独立开发、独立运行 的能力。

为了方便项目开发和管理,提议引入微前端,实现独立开发独立部署,便开始了qiankun漫漫之路。

qianjun接入,注册子应用按照官网步骤来,很快就可以实现一个简单的主子应用,为了避免以后每次开发一个子项目,主项目都要打包更新的问题,所以从动态路由入手。

最开始没有搞清楚qiankun和plugin-qiankun的区别,以及对文档阅读的不细致走了很多弯路,希望接下来这篇文档对你的开发会有一些小小的帮助。

在开始这个问题之前先要搞清楚两个概念:

qiankun:

官网地址:https://qiankun.umijs.org/zh/guide/getting-started

umijs/plugin-qiankun:

官网地址:@umijs/plugin-qiankun

敲重点!!!

首先要知道qiankun和umijs/plugin-qiankun不是一种东西,前者是纯净版,后者可以理解为在前者基础上的封装,是umi脚手架下安装qiankun插件,两者是不同的接入方法。另外后者可以使用前者的注册方法。

一、qiankun具体使用:

安装:

yarn add qiankun # 或者 npm i qiankun -S

主应用接入(注册子应用)

第一种方法:约定式路由,该种方法需要在主应用内提前进行定义。(缺点:每次打包都需要更新主应用,如果不考虑动态路由可使用该方法)

入口文件中加入以下代码:app.js 或者是index.js


import { registerMicroApps, start } from 'qiankun';

registerMicroApps([
  {
    name: 'react app', // 子应用package.json的name值
    entry: '//localhost:7100',//子应用的访问地址
    container: '#yourContainer',//主应用容器(子应用会插入该位置)
    activeRule: '/yourActiveRule',//匹配子应用路由
  },
  {
    name: 'vue app',
    entry: { scripts: ['//localhost:7100/main.js'] },
    container: '#yourContainer2',
    activeRule: '/yourActiveRule2',
  },
]);

start(); //启动注册微应用,必需

第二种:手动加载微应用:目前只试了在点击事件中加载微应用;该种方法必须要有主容器的容器的id,否则报错,我们项目中使用的是antd design pro,所以在主容器的标识上会报错,切换到子应用再切换会主应用自身路由的时候页面报错,这个问题还有待探讨。

该种方法可以在任意位置添加,添加后注意应用销毁

import { loadMicroApp } from 'qiankun';

loadMicroApp({
  name: 'app',//子应用package.json的name值,必填
  entry: '//localhost:7100',//子应用入口地址,必填
  container: '#yourContainer',//主应用容器(子应用会插入该位置),必填
});

以上微应用不需要额外安装任何其他依赖即可接入 qiankun 主应用,只需要在子应用入口文件处导出相应的生命周期钩子即可

 二、umijs/plugin-qiankun具体说明

安装

yarn add @umijs/plugin-qiankun -D

主应用接入(注册子应用)

第一种:构建期配置子应用(约定式路由)

该配置项可放到config.js配置中导出,需要在主应用中手动配置子应用,添加子应用后要及时修改主应用。

export default {
  qiankun: {
    master: {
      // 注册子应用信息
      apps: [
        {
          name: 'app1', //子应用package.json中的name值
          entry: '//localhost:7001', // 子应用项目入口
        },
        {
          name: 'app2', // 唯一 id
          entry: '//localhost:7002', // html entry
        },
      ],
    },
  },
};

重点来了!!!!!!!!

第二种:运行时动态配置子应用(src/app.ts 里开启),该种方法也是我在项目中应用的,用户登录之后获取对应菜单数据,对数据进行处理,通过参数apps和routes进行菜单和路由渲染

在入口文件中添加

// 从接口中获取子应用配置,export 出的 qiankun 变量是一个 promise
// 应用到项目后可替换成自己的接口,最后把处理好的masterOption retrun出来就可以了。

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

masterOption 参数要重点讲一下,看文档的时候没用注意到还有多个配置项,这个也是困扰我很久的问题,最后配置完后发现豁然开朗,同时也感叹了下文档写的.........xxx

 

 从而可以通过masterOption 的routes参数,实现路由的动态加载。

第三种:在路由配置中注册

同时也可以在路由文件中进行约定式配置,参数格式同以上routes保持一致

export default {
	routes: [
    {
      path: '/',
      component: '../layouts/index.js',
      routes: [
        {
          path: '/app1',
          component: './app1/index.js',
          routes: [
            {
              path: '/app1/user',
              component: './app1/user/index.js',
            },
+            // 配置微应用 app1 关联的路由
+            {
+              path: '/app1/project',
+              microApp: 'app1',
+            },
          ],
        },
+       // 配置 app2 关联的路由
+       {
+         path: '/app2',
+         microApp: 'app2'
+       },
        {
          path: '/',
          component: './index.js',
        },
      ],
    },
  ],
}

第四种:<MicroApp/>组件方式,官方建议使用这种方式来引入不带路由的子应用,可以实现任意位置挂在自己的子应用。因不符合使用场景,为尝试该种方法。

import { MicroApp } from 'umi';

export function MyPage() {

  return (
    <div>
      <div>
+        <MicroApp name="app1" />
      </div>
    </div>
  )
}

 注册子应用

该种方法需要在config.js中注册插件

export default {
  qiankun: {
    slave: {},
  },
};

生命周期:

export const qiankun = {
  // 应用加载之前
  async bootstrap(props) {
    console.log('app1 bootstrap', props);
  },
  // 应用 render 之前触发
  async mount(props) {
    console.log('app1 mount', props);
  },
  // 应用卸载之后触发
  async unmount(props) {
    console.log('app1 unmount', props);
  },
};

两者的生命周期函数和数据传参使用类似,这些按照文档来就比较简单一点了

=========================================================================

说点题外话

如果使用umi脚手架生成的项目,推荐两种非常实用的方法

可以在入口文件中可以使用render()和patchRoutes() 对路由进行格式处理

//修改路由
//比如在最前面添加一个 /foo 路由,

export function patchRoutes({ routes }) {
  routes.unshift({
    path: '/foo',
    exact: true,
    component: require('@/extraRoutes/foo').default,
  });
}
//渲染前做权限校验,如果用antd-design-pro也可以再access.js中做权限校验
import { history } from 'umi';

export function render(oldRender) {
  fetch('/api/auth').then(auth => {
    if (auth.isLogin) { oldRender() }
    else { 
      history.push('/login'); 
      oldRender()
    }
  });
}

欢迎讨论~

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值