文章目录
- 一文大白话讲清楚webpack进阶——8——Module Federation
- 1. 啥是Module Federation
- 2. 这里讲两个基础概念
- 3. 容器应用配置
- 4. 远程应用配置
- 5. 模块使用
- 5. ModuleFederation好在哪里
- 6. ModuleFederation实战
一文大白话讲清楚webpack进阶——8——Module Federation
1. 啥是Module Federation
- Module是模块,Federation是捆绑,Module Federation就是模块联邦,
- 那问题来了谁跟谁联邦,怎么联邦
- 第一个问题,可以概括为把别人的微前端绑定到自己的项目中,作为本项目的一个模块,从而实现代码共享
- 第二个问题,怎么绑,先不着急回答,先讲我们之前用第三方库代码怎么用,得通过npm或者yarn等包管理工具下载到本地,然后再项目中引用。也就是说,我们在项目的中必须要有这个物理包,然后引入。再说模块联邦怎么绑定,一句话,远程绑定,换句话说就是不同把第三方库代码下载到本地,直接上URL。
- Module Federation是webpack5引入的新特性,它允许不同的web应用在运行时共享代码,不需要传统的打包或者发布过程中的物理共享,这表示每个微应用都可以独立开发,构建,部署,还能轻松地实现共享组件,库甚至是业务逻辑。可以说,彻底改变了微前端的结构实现
2. 这里讲两个基础概念
- 1. 容器应用
- 作为微前端结构的宿主,负责加载和协调哥哥微应用,说白了就是在你的项目中,既然要联邦很多微应用,那总得有一个负责引用和管理这些微应用的东西吧,这个就是
- 2. 远程应用
- 说白了就是你项目中引用的微应用,是独立的,可以暴露自己的模块给其他应用使用,当然也可以作为容器应用引用来自其他英勇的模块。
- 一句话,容器应用和远程应用我中有你,你中有我,我可以是你,你也可以是我,就看你是用别人的,还是被别人用的
3. 容器应用配置
- 大白话,就是你怎么应用别人
- 我们在webpack.config.js中通过ModuleFederationPlugin来声明远程微应用的来源
const ModuleFederationPlugin=require('webpack/lib/container/ModuleFederationPlugin')
module.exports={
plugins:[
new ModuleFederatoionPlugin({
name:'container',
remotes:{
app1:'app1/@http:xxx.js',
app2:'app2/@http:yyy.js'
},
shared:{
react:{
singleton:true
}
}
})
]
}
4. 远程应用配置
- 大白话就是,你怎么被别人使用
- 我们在webpack.config.js中同样使用ModuleFederationPlugin进行配置,但这次不是引用别人,还是暴露自己,被别人使用
const ModuleFederationPlugin=require('webpack/lib/container/ModuleFederationPlugin')
module.exports={
plugins:[
new MoudleFederationPlugin({
name:'app1',
filename:'xxx.js',
exposes:{
'./MyCompent':'./src/components/MyCompent',
},
shared:{
react:{
singlerton:true
}
}
})
]
}
5. 模块使用
- 通过容器应用配置MyComponent组件后,我们可以直接在本地项目中导入远程引用暴露出来的MyComponent模块
import MyComponent from 'app1/MyComponet'
const fn=()=>{
return (
<div>
<MyCompent/>
</div>
)
}
export default fn
5. ModuleFederation好在哪里
- 独立开发和部署,每个微应用都可以独立开发,构建恶化部署,大大提高开发效率和部署灵活性
- 实现按需加载,应用在首屏加载上,能提升性能
- 良好的版本管理和隔离,各微应用独立维护版本,避免版本冲突问题
- 抑郁维护,Module Federation有较好的松耦合性,使得添加和移除微应用变得简单而方便
6. ModuleFederation实战