umijs / qiankun

📦 🚀 Blazing fast, simple and complete solution for micro frontends.
https://qiankun.umijs.org
MIT License
15.79k stars 2.01k forks source link

qiankun的父子项目都用的umi, 用Module Federation做模块共享,控制台报错 Loading script failed #1642

Open rt-bear opened 3 years ago

rt-bear commented 3 years ago

What happens?

qiankun的父子项目都用的umi, 用Module Federation做模块共享,控制台报错 Loading script failed remoteEntry.js的路径很奇怪 http://localhost:3001///localhost:3000/remoteEntry.js image

查阅webpack文档,output.publicPath 配置项设置为 'auto' ,并没有效果

最小可复现仓库

https://github.com/rt-bear/qiankun-mf-demo

复现步骤,错误日志以及相关配置

  1. yarn start:mf1 启动mf1
  2. yarn start:mf2 启动mf2
  3. 访问 http://localhost:3001/ ,发现mf2 可以正常通过Module Federation引入mf1组件
  4. yarn start:mf0 启动mf0 mf0 为qiankun主项目 mf2为子项目
  5. 访问 http://localhost:8000/ 复现控制台报错 Loading script failed, remoteEntry.js的路径引入错误

相关环境信息

liuxiangoppo commented 3 years ago

同求 我也出现了同样的问题 目前在找解决方案。

liuxiangoppo commented 3 years ago

找到了一个方案可以解决你所描述的问题,关闭乾坤的沙箱配置就行。 start({sandbox:false}) https://github.com/umijs/qiankun/issues/1148

rt-bear commented 3 years ago

我的demo里面沙箱就是关闭,没有生效 https://github.com/rt-bear/qiankun-mf-demo/blob/26ffcb18c25336580a2ea3f06ac1b45949d1d84d/packages/mf0/.umirc.ts#L22

iceberg211 commented 3 years ago

@rt-bear 可以参照webpack5 的文档进行修改,已经可以在主应用里加载 https://github.com/module-federation/module-federation-examples/blob/master/advanced-api/dynamic-remotes/app1/src/App.js

comewithl commented 2 years ago

如果是path问题可以尝试下使用Promise的引入方式

zjjjjjjjjjjd commented 2 years ago

配置publicPath可以解决

zjjjjjjjjjjd commented 2 years ago

@rt-bear 大佬这套架构成功了吗?我最近也在研究这套架构,但是遇到一个很严重的问题,方便交流一下吗?

xuebigshuai commented 1 year ago

这个问题有两个原因

  1. publicPath没有解析正确。如果设置publicPath:‘auto’ 还是不行,vue-cli的issue中有个重写publicPath插件[PublicPath notworking when target is lib in webpack5 ModuleFederationPlugin]](https://github.com/vuejs/vue-cli/issues/6458)。
  2. 只有在qiankun中使用会出现的问题,是由于子应用的模块联邦配置没有配 library属性,该属性的默认值是var,在乾坤中由于给子应用包裹了一层代理,var 模式无法挂载到window上。 所以需要配置library属性,如果是嵌套使用(子应用通过模块联邦使用了其他模块),还要配置remoteType属性,如果不配,默认加载其他应用的共享模块模式是跟随library的配置属性,会报fn is undefined的错误。具体配置如下,
    config
      .plugin("module-federation-plugin")
      .use(require("webpack").container.ModuleFederationPlugin, [
        {
          name: "test", // 不能带中划线,使用驼峰命名
          filename: "remoteEntry.js",
          library:{type:'umd',name:"sitRuntimeWeb"},
          remoteType:'script',
          exposes: {
            ".": "./packages/index.js",
          },
          remotes: {
            "xxxxx": "xxxx.remoteEntry.js",
          }
        }
    ]);
    }
Calvin-for-AI commented 1 year ago

url错误,一般是这个问题导致的. 在使用qiankun和Mf的情况下,先加载qiankun,启动js沙箱,后加载mf模块