当前位置: 首页 > news >正文

UMI 中使用qiankun问题记录

背景:基座应用使用的umi,子应用没有使用umi,但也是使用react。
Umi 文档:https://umijs.org/docs/max/micro-frontend#route
按照官方文档配置,记录一些问题, 以及全部配置

目录

    • 问题
      • 一、如何传值
      • 二、loading状态变更
      • 三、样式隔离
          • 1、当父子应用的html的字体大小不一样,导致子应用rem的字体大小跟随父应用的html字体来,
      • 四、子应用中window.open 处理
          • 问题
          • 解决
      • 五、子应用中`<iframe> `处理
          • 问题
      • 六、跨域问题
    • 全部配置
      • 一、父应用(基座应用)
        • 1、config.ts或者.umirc.ts
        • 2、在app.tsx导出qiankun配置
        • 3、组件和路由配置
        • 4、子系统中的代理,父系统要重新定义
      • 二、子应用
        • 1、在src下新增一个文件public-path.js
        • 2、修改配置文件
        • 3、 在入口文件src/index.tsx 中加入
        • 4、跳转处理
        • 5、路由处理
    • 其他问题

问题

一、如何传值

1、onGlobalStateChange 传值方式,需要二次触发state变动才行。
我们的应用是登录获取用户信息后,才加载子应用,然后传值, 在mount中拿不到值,需要二次触发变更才行

// 应用每次进入都会调用 mount 方法,通常我们在这里触发应用的渲染方法
export async function mount(props) {console.log('mounted', props);// 方式一: 这个首次触发不执行, 要第二次触发才行props.onGlobalStateChange((state, prev) => {// state: 变更后的状态; prev 变更前的状态console.log('子应用', state, prev);});// 子应用渲染initRender(props);
}

2、umi传函数,获取一个全局变量。(当前情况使用该方式

// 基座应用 app.ts
let initInfo = {};
export const qiankun = {apps: [{name: 'aurora',entry: 'http://localhost:3000/', // process.env.OLD_SYS_HOST// container: '#aurora',activeRule: '/aurora',props: {getUserInfo: () => initInfo,},},],
}
// 一些api调用获取信息
api().then(res => initInfo = res)// 子应用, 直接调用函数获取
export async function mount(props) {console.log('mounted', props.getUserInfo());
}

二、loading状态变更

根据官网的配置,无论是自定义加载动画还是使用autoSetLoading, 发现loading状态一直返回true。
我们需要在afterMoute时设置为false,我们手动执行这步

// 在基座应用新增子应用生命钩子配置
export const qiankun = {apps: [],lifeCycles: {// 配置生命钩子,用于loading,umi提供的子应用加载动画有问题,不会结束async afterMount(props) {console.log('挂载完');// 发现props中有个setLoading函数,执行props.props.setLoading(false); },async afterUpdate(props) {console.log('更新')}},
};

如果使用 autoSetLoading, 可以在global.less 中修改loading的样式。

// qiankun 子应用loading的样式修改,这里使用的是route配置microAppProps下autoSetLoading
.qiankun-micro-app-wrapper {.ant-spin-spinning {margin-top: calc(50vh - 16Px);.ant-spin-dot {font-size: 32Px;i {width: 14Px;height: 14Px;}}}
}

三、样式隔离

将父应用或者子应用的样式加前缀
使用antd框架:

// webpack配置
{loader: 'less-loader',options: {lessOptions:{modifyVars: {// @ant-prefix是自定义antd组件类名前缀的,需要配合<ConfigProvider prefixCls="gap-ant">使用"@ant-prefix": "gap-ant",},}},
}// 入口jsx
<ConfigProvider prefixCls="gap-ant">

有些文档说message和modal需要单独修改, 但实践发现Modal已经被修改了,message没有,可能是版本更新了

message.config({top: 100,duration: 2,maxCount: 3,prefixCls: 'gap-ant-message', // 注意messge自己定义的前缀 需要加上 -message
});
Modal.config({rootPrefixCls: 'gap-ant',
})

如果是用的element框架,使用插件替换:
1、使用change-prefix-loader替换js中的class前缀
2、使用postcss-change-css-prefix替换css样式前缀
参考: https://blog.csdn.net/shanghai597/article/details/133884670

如果是自定义的样式,没有统一的前缀, 就不能使用这种方法了
问题记录: postcss-change-css-prefix 导致echarts的包冲突了,项目无法启动。
直接复制源码代码,当做自定义插件配置:

const postcss = require('postcss');const replaceStr = (str, prefix, replace) => {const reg = new RegExp(`(^|(\\s)+|\\.|=)${prefix}(?!icon)`, 'g');return str.replace(reg, `$1${replace}`);
};module.exports = postcss.plugin('class-prefix', function (opts = {}) {const { prefix = 'ant-', 
http://www.dtcms.com/a/464984.html

相关文章:

  • 演示和解读ChatGPT App SDK,以后Android/iOS App不用开发了?
  • Spring Boot 与 WebSocket:长连接掉线、心跳与消息广播的问题
  • 数琨创享:新能源行业标杆企业QMS质量管理平台案例
  • 如何用easyui做网站网站设计说明书5000字
  • 从MySQL到ClickHouse超大规模数据分析的架构迁移实践与性能对比
  • 架构图在什么网站可以做wordpress-saas
  • echarts不根据传入参数,自定义 legend 的内容(视觉映射)
  • H3C IRF
  • 【C++】继承深度解析:继承方式和菱形虚拟继承的详解
  • 徐州 网站 备案 哪个公司做的好phpcms 中英文网站
  • WebSocket | 一点简单了解
  • 算法题基础 : Java : BufferedReader、BufferedWriter 和 StringTokenizer 详解
  • 企业微信 自建应用审批流程引擎功能开发【报错分析】
  • Slf4j 接口文档左侧菜单有显示,但是点击后空白
  • 【AES加密专题】4.Sbox的解析和生成
  • 考完HCIE数通,能转云计算 / 安全 / AI方向吗?
  • 重庆企业网站建设推荐怎么申请域名和备案
  • 松江 网站建设公司拼多多推广联盟
  • 中国极端气象干旱事件(1951-2022)
  • 一文详解Go 语言内存逃逸(Escape Analysis)
  • 学习threejs,实现粒子化交互文字
  • 密码学基础:RSA与AES算法的实现与对比
  • RAG:生成与检索的完美结合
  • 一款由网易出品的免费、低延迟、专业的远程控制软件,支持手机、平板、Mac 、PC、TV 与掌机等多设备远控电脑!
  • [C# starter-kit] Blazor EntityTable 组件 | 预构建
  • 深入浅出 AI Agent:从概念本质到技术基石
  • 宁波网站制作服务wordpress搭建淘客网站
  • 第五章:Go的“面向对象”编程
  • 【实用工具】mac电脑计算文件的md5、sha1、sha256
  • 数据结构算法学习:LeetCode热题100-矩阵篇(矩阵置零、螺旋矩阵、旋转图像、搜索二维矩阵 II)