2021-06-30 11:35:36
使用Webpack的Module Federation实现微前端的核心是通过Host应用动态加载Remote应用暴露的模块,并共享依赖以避免重复加载。以下是具体实现步骤和关键配置说明:
1. 核心角色划分在子应用的Webpack配置中,使用ModuleFederationPlugin暴露模块:
// webpack.config.js (Remote应用)new ModuleFederationPlugin({ name: 'app2', // 唯一标识 filename: 'remoteEntry.js', // 暴露的入口文件 exposes: { './Button': './src/components/Button', // 暴露的组件路径 './App': './src/App', }, shared: { react: { singleton: true }, // 共享依赖配置 'react-dom': { singleton: true } }});name:远程应用的唯一标识,Host通过此名称引用。
exposes:定义可被外部加载的模块路径(如组件、页面)。
shared:声明共享依赖,singleton: true确保全局单例,避免重复加载。
在主应用的Webpack配置中,声明远程应用地址和共享依赖:
// webpack.config.js (Host应用)new ModuleFederationPlugin({ name: 'app1', remotes: { app2: 'app2@remotes:指定远程应用的名称和入口文件URL(需确保网络可达)。
shared:与Remote的共享依赖配置保持一致,避免版本冲突。
配置完成后,Host可直接像导入本地模块一样使用Remote暴露的组件:
import Button from 'app2/Button'; // 格式:远程应用名/暴露的模块名function App() { return ( <div> <h1>主应用</h1> <Button /> {/* 动态加载的子应用组件 */} </div> );}shared中的依赖版本和配置需在Host和Remote中完全一致。
远程URL拼写错误会导致加载失败。
配置正确的资源路径(如CDN地址)。
使用环境变量动态管理远程URL。
通过webpack-dev-server的proxy解决跨域问题。
使用publicPath配置资源基础路径。
暴露组件:exposes: { './Button': './src/Button' }。
启动服务后,remoteEntry.js可通过
配置remotes: { app2: 'app2@
直接import Button from 'app2/Button'使用子应用组件。
通过以上步骤,可实现基于Webpack Module Federation的微前端架构,支持动态加载、依赖共享和独立开发部署。