-
Notifications
You must be signed in to change notification settings - Fork 2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
webpack5 使用模块联邦,抛出异常,生命周期未加载 #1515
Comments
碰到一样的问题,mark |
没找到方案,避开了,放弃了模块联邦 |
解决了。 1、把入口改成: const { bootstrap, mount, unmount, update } = await import('./main')
export { bootstrap, mount, unmount, update } webpack要设置一下 2、webpack配置的output.library不能跟ModuleFederationPlugin里的name一样。调试了一下发现如果一样的话在import-html-entry里边获取qiankun生命周期会失败 |
问下这个是哪里看到的方案吗?还是怎么考虑到的? |
自己调试找的办法。你可以试试你项目里能不能用 |
请教下,模块联邦在qiankun中引入的用途是什么呢 |
项目中一个特殊模块用到了模块联邦,webpack升级到了5,后来想把项目拆分成微前端。组内有其他项目用了qiankun,所以用的一样的。 |
我们项目的情况是拆分了很多qiankun微模块,各个微模块之间重复代码需要复用,用npm的话更新一次要更新十几个微模块,想用联合模块来复用这些代码 |
补充一下:
|
既然使用了webpack5的模块联邦,那就不应该再使用qiankun了,模块联邦本身就可以实现微前端架构 |
不好意思我漏写了一步,要在html-webpack-plugin里面改一下chunksSortMode,把入口js放最后面,因为mf生成的remoteEntry.js默认是在最后的, |
确实,感觉两者的设计思路就是相反的两个方向 |
1.是的,需要在Hosts应用的webpack中加配置
2.我把Remotes应用入口文件也改成了异步导出,然后发现可以了,我的是React应用,现在在demo中能正常使用。 可以看一下我的demo代码: |
我认为比较好的解决方案:写一个 webpack plugin 然后 hook 到 html-webpack-plugin 写入标签之前的时机,在回调函数中为我们的入口 script(可以通过正则匹配) 属性添加 ‘entry’ 即可。 |
mark |
谢谢,呵呵!~~
|
更好的去做代码共享,复用公共依赖。之前可能我们使用 external,cdn,等方式提取公共依赖,或者用单独 npm 包的方式抽取公共代码逻辑, 现在用模块联邦可以直接做到. |
谢谢,呵呵!~~
|
"要求webpack的entry要被额外包装一层,处理成动态引入" 这个并不是MF必要的配置,而是webpack的建议:异步边界(asynchronous boundary) ,我目前没有使用这种在入口异步引用的方式,qiankun可以正常使用MF,代码中用到远程模块时,直接用 await import('remote/module1') 这种就行了 |
谢谢,呵呵!~~
|
尝试通过plugins设置入口 script,属性添加‘entry’后,依旧报错“找不到子应用生命周期” |
谢谢,呵呵!~~
|
遇到同样问题,现在有解决方案吗,组件共享不用模块联邦,有什么好的替代方案吗? |
项目是vue2.x demo地址:https://github.com/w123angmeng/demo.git |
我上面那个解法,react 是没有问题的,vue 我就不知道了。 |
各位大佬们,现在这个问题有好的解决办法了吗? @w123angmeng |
谢谢,呵呵!~~
|
|
谢谢大佬 |
子应用配置 mf 以后,只需要把用到 remote 的逻辑放在异步边界里就行了,其余的逻辑可以不用改,也可以不用开 topLevelAwait。 import '../public-path'
async function bootstrapWithoutQiankun() {
if (!window.__POWERED_BY_QIANKUN__) {
const { render } = await import('./bootstrap')
render({})
}
}
bootstrapWithoutQiankun()
const umountHandlerRef: { current?: () => void } = { current: undefined }
export async function bootstrap() {
console.log('[react18] react app bootstrapped')
}
export async function mount(props: any) {
const { render, unmount } = await import('./bootstrap')
render({})
umountHandlerRef.current = unmount
}
export async function unmount() {
console.log('[react18] react app unmount')
umountHandlerRef.current?.()
} 我这边用 mf 共享了 react 组件,所以把 render 的逻辑放 bootstrap 就可以。 |
谢谢,呵呵!~~
|
我按照这种逻辑来写。仍然带来问题。首先就是在mount函数中import.那么import会在主项目环境中执行的吧,import的资源直接就是404 |
谢谢,呵呵!~~
|
当然你子应用里得有 bootstrap 这个文件 |
谢谢,呵呵!~~
|
有一个最终的解决方案吗 谁有qiankun+mf的最简demo能参考下 |
谢谢,呵呵!~~
|
有一个最终的解决方案吗,麻烦发下demo 谢谢 |
谢谢,呵呵!~~
|
谢谢,呵呵!~~
|
webpack5 使用模块联邦,抛出异常,生命周期未加载
在webpack5 使用模块联邦时(子应用作为consume),要求webpack的entry要被额外包装一层,处理成动态引入,如果按照要求使用,那么这时候主应用不能检测到子应用的生命周期,如果只把生命周期也放在这一层,内部不加任何逻辑,是没问题的,但是生命周期中需要做渲染,那么就需要引入react,就会出现异常。请问有什么处理方案吗
The text was updated successfully, but these errors were encountered: