• Antd Pro项目接入qiankun微前端


    在开始之前,请先提前了解微前端相关概念
    场景:

    antd pro项目中接入qiankun,抽离其中某个模块作为子应用

    一、项目技术

    二、@umijs/plugin-qiankun

    在开始做的时候先去了解了一些开源的微前端插件,最后决定使用阿里的qiankun,正好umi里面内置了一个qiankun的插件

    如果使用 antdpro+umi+qiankun的架构做微前端,那就直接去看umi的官方文档,了解相关配置

    三、主应用配置

    项目配置之前先浏览一遍官方的配置案例,下面说的的内容仅是我在项目中使用到的

    1、安装依赖

    yarn add @umijs/plugin-qiankun -D

    2、注册子应用

    // 根目录config文件夹下的config.ts
    // 在导出的defineConfig里面添加
    
      qiankun: {
        master: { 
          {
            name: 'app1', // 唯一 id
            entry: '//localhost:9001', // html entry
            props: {}, // 传递子应用的参数
          },
        },
      },
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 如果有多个子应用,就在master下面注册多个
    • 可以在根目录下面新建.env文件来指定启动端口

    PORT=9001

    3、添加访问子应用的路由

    主应用配置一个菜单路由,内容是访问子应用的具体页面的路由

         {
            path: '/project/development/index',
            name: 'dataDevelopment',
            microApp: 'app1',  // 和上面注册子应用的唯一id对应起来
          }, 
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4、修改主应用中document.ejs文件中的根id,防止跳转子应用一直处于页面加载状态

    <div id="root">
      
    // id修改为动态的 
    <div id="<%= context.config.mountElementId %>">
    // 在根目录下config/config.ts中加一个mountElementId属性和值
    
    • 1
    • 2
    • 3
    • 4
    • 5

    四、子应用配置

    1、安装依赖

    yarn add @umijs/plugin-qiankun -D

    2、注册插件

    // 根目录config文件夹下的config.ts
    // 在导出的defineConfig里面添加
    
     qiankun: {
        slave: {},
     },
     base: '/',   // 这个如果不加的话,页面路由会自动拼上子应用package.json中name的内容
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3、 配置运行时生命周期钩子

    // 根目录下app.ts中导出
    
    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);
      },
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4、路由存在

    保证子应用路由里面存在主应用里面注册的地址

    五、父子应用传值通信

    1、配合 useModel 使用(推荐)

    需确保已安装 @umijs/plugin-model 或 @umijs/preset-react

    • 主应用中
      src/app.ts里导出一个 useQiankunStateForSlave函数,函数的返回值将作为 props 传递给微应用
    // src/app.ts
    // qiankun传递给子应用的参数
    export function useQiankunStateForSlave() {
      const [masterState, setMasterState] = useState({});
    
      return {
        masterState,
        setMasterState,
      };
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 子应用中
      子应用中会自动生成一个全局 model,可以在任意组件中获取主应用透传的 props 的值。

    2、基于props传递

    这种方式主要是在主应用中注册子应用的时候,同步加一个props的属性,上面注册子应用的时候我代码里面我已经提到了

    子应用直接在app.ts中配置的生命周期钩子中获取 props 消费数据(参考上面子应用的配置)

    3、组件共享

    • 关于组件共享可以考虑npm包 的形式来解决
      • 搭建npm私有服务器
      • 组件库搭建

    4、使用qiankun官网提供的Actions通信

    看另一篇actions通信补充

    六、线上主应用访问子应用跨域

    通过nginx配置允许子应用被访问的域名

    • 以抽离出来的模块为例
    • 在nginx里面添加
        # 配置允许被xxxxx.com跨域访问
        add_header Access-Control-Allow-Origin xxxxx.com; 
     
    
    • 1
    • 2
    • 3
  • 相关阅读:
    2609. 最长平衡子字符串
    vlookup查找匹配值超过255个字符显示#Value的解决办法
    通讯网关软件001——利用CommGate X2Access-U实现OPC UA数据转储Access
    TCP连接管理
    【Transformer从零开始代码实现 pytoch版】(二)Encoder编码器组件:mask+attention+feed forward+add&norm
    Java 并发高频面试题:聊聊你对 AQS 的理解?
    ElasticSearch中基础API操作
    设计模式(十一)----结构型模式之装饰者模式
    冰狐智能辅助入门教程
    Spring详解(三)—— IOC 和 DI 区别
  • 原文地址:https://blog.csdn.net/qq_41534913/article/details/127446010