在大型利用中, 咱们可能会对其进行拆分,分成容器、主利用和多个子利用,使拆分后的利用独立开发与部署,更加容易保护。但无论是微利用、公共模块利用,都须要放到容器中能力应用。

如果多个利用之间心愿资源共享,除了应用 npm 包的模式,基于Webpack 5 Module Federation(模块联邦)实现的EMP微前端计划也能够一试,它不限度技术栈,但依赖于 Webpack5。

应用场景

如果利用B须要应用利用A中的User模块,那么利用B就相当于容器,同时利用A也能够应用来自利用C的Menu模块,此时利用A变成了容器。

如何应用

要想应用 Module Federation,必定是须要搭建 webpack 环境,配置形式也比较简单,应用 ModuleFederationPlugin 别离导出/导出即可。

A利用导出文件

webpack配置须要导出的文件门路和名称

 // 其余配置省略const Mfp = require('webpack').container.ModuleFederationPlugin;module.exports = {    plugins: [     new Mfp({        // 对外提供打包后的文件名        filename: 'user.js',            // 导出的利用/组织什么名字        name: 'userComponent',        // 要导出哪一个文件,key值为引入时的名字,value为以后文件门路        exposes: {            './username': './src/username.js',            './userHobby': './src/userHobby.js',        }    })  ]}

B利用导入文件

webpack设置须要导入的资源地址和名称

const Mfp = require('webpack').container.ModuleFederationPluginplugins: [    new Mfp({        name: 'root',        // key值为导入后应用的名字,value为导出的 filename@文件地址/name,设置本地服务地址不便调试        remotes: {            userComponent: 'userComponent@http://localhost:3001/user.js'        }    })]

在须要应用的js文件中异步导入,userComponent 是定义的导入后的名字,斜杠(/)加上导出文件webpack配置exposes属性的文件名

const Username = React.lazy(()=>import('userComponent/username'))const UserHobby = React.lazy(()=>import('userComponent/userHobby'))return (<React.Suspense fallback="loading">     <Username/>    <UserHobby/></React.Suspense>)

引入后,http://localhost:3001/user.js 将会被加载,并且资源内容挂载到 window 对象中。

这样,便能够达到利用之间共享组件的目标。

以上就是 Webpack Module Federation(模块联邦) 的介绍, 更多无关 前端工程化 的内容能够参考我其它的博文,继续更新中~