Umi和模块联邦MF-原理和场景

298 阅读2分钟

一、MF方案的原理和特点

Module Federation | webpack 中文文档

二、MF方案的优缺点

对比第三方仓库

优点:不需要手动更新依赖包的版本。

缺点:

(1)应用之间强耦合。

本地开发:需要开启所有的项目主应用、子应用,因为运行需要。

线上部署:健壮性受损,一个子应用挂掉,所有的应用都会挂掉。

(2)代码复用较差,灵活性很差。

如果A应用依赖B应用,我只想部署A应用的时候,仍然需要部署B应用提供共享组件。

第三方仓库只负责提供代码,不需要应用部署,就能解决这种问题

三、模块联邦的适用场景

(1)本地开发:A应用和B应用 需要同时开发,A应用使用了B应用暴露的组件BTN,B应用BTN还需要微调适用于A应用。

(2) 线上部署:与本地一致。

这样可以节省了 组件库 需要 频繁发包或者link 包的过程。

(3)其他场景:

四、umi的mfsu功能特性存在与mf功能的冲突。

mfsu介绍:juejin.cn/post/717210…

复现问题步骤:

(一)、子应用fe-resource-lib 提供共享的组件(provider身份)

//  .umirc 文件
const shared = {
  react: {
    singleton: true,
    eager: true,
  },
  'react-dom': {
    singleton: true,
    eager: true,
  },
  'antd': {
    singleton: true,
    eager: true,
  },
};

export default defineConfig({
  mfsu: true,
  mf: {
    shared,
    name: 'resourceLib',
  }
})

(二)、子应用fe-scenarios (Consumer身份) 使用fe-resource-lib的共享组件

//  .umirc 文件
const shared = {
  react: {
    singleton: true,
    eager: true,
  },
  'react-dom': {
    singleton: true,
    eager: true,
  },
  'antd': {
    singleton: true,
    eager: true,
  },
};

export default defineConfig({
  mfsu: true,
  mf: {
    shared,
    remotes: [
      {
        name: 'resourceLib',
        entry: 'http://127.0.0.1:8003/remote.js',
      },
    ],
})
// src/pages/components.tsx 远程mf加载 fe-resource-lib共享组件
import ButtonLib from 'resourceLib/Button';
export default function Components(): JSX.Element {
  return <ButtonLib />
}

// 报错,React出现多实例导致

(三)寻求umi解决方案

umijs.org/docs/max/mf…

以上mf和mfsu似乎没有同步。

总之,

  1. 开启mfsu后,就会出现React多实例问题。

  2. mfsu: false后,能够解决多实例问题。

(四)子应用mfsu: false关闭后,带来新的问题!(umi官方已经修复)

子应用单独启动没有问题。

但是!使用主应用集成子应用的时候,qiankun报错“You need to export lifecycle functions in resource-lib entry”。

原因:mfsu: false关闭后,导致主应用识别子应用入口的entry 错误。为什么会这样?需要进一步查看具体mfsu源码....

参考:github.com/umijs/qiank…

小结:

如果需要使用mf,将所有mfsu设置为false(避免React多实例问题)。

主应用集成子应用的时候,只能在生产环境下(未实践,尚不知mfsu对生产环境的影响)。

五、MFSU的一些问题

issues问题较多,文档不缺,尚不成熟。