# 模块联邦 在大型项目中,往往会把项目中的某个区域或功能模块作为单独的项目开发,最终形成「微前端」架构 在微前端架构中,不同的工程可能出现下面的场景 ![image-20210122172549530](http://mdrs.yuanjin.tech/img/20210122172549.png) 这涉及到很多非常棘手的问题: - 如何避免公共模块重复打包 - 如何将某个项目中一部分模块分享出去,同时还要避免重复打包 - 如何管理依赖的不同版本 - 如何更新模块 - `......` `webpack5`尝试着通过`模块联邦`来解决此类问题 ## 示例 现有两个微前端工程,它们各自独立开发、测试、部署,但它们有一些相同的公共模块,并有一些自己的模块需要分享给其他工程使用,同时又要引入其他工程的模块。 image-20220208150515731 ### 初始化工程 #### home项目 安装 ```shell # 初始化 package.json npm init -y # 安装依赖 npm i -D webpack webpack-cli webpack-dev-server html-webpack-plugin npm i jquery ``` 修改`package.json` ```json "scripts": { "build": "webpack", "dev": "webpack serve" } ``` 配置`webpack.config.js` ```js const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: './src/index.js', mode: 'development', devtool: 'source-map', devServer: { port: 8080, }, output: { clean: true, }, plugins: [ new HtmlWebpackPlugin() ] }; ``` 代码 ```js // src/now.js import $ from 'jquery'; export default function (container) { const p = $('

').appendTo(container).text(new Date().toLocaleString()); setInterval(function () { p.text(new Date().toLocaleString()); }, 1000); } // src/bootstrap.js import $ from 'jquery'; import now from './now'; // 生成首页标题 $('

').text('首页').appendTo(document.body); // 首页中有一个显示当前时间的区域 now($('
').appendTo(document.body)); // src/index.js import('./bootstrap') ``` #### active项目 安装 ```shell # 初始化 package.json npm init -y # 安装依赖 npm i -D webpack webpack-cli webpack-dev-server html-webpack-plugin npm i jquery ``` 修改`package.json` ```json "scripts": { "build": "webpack", "dev": "webpack serve" } ``` 配置`webpack.config.js` ```js const HtmlWebpackPlugin = require('html-webpack-plugin'); module.exports = { entry: './src/index.js', mode: 'development', devtool: 'source-map', devServer: { port: 3000, }, output: { clean: true, }, plugins: [ new HtmlWebpackPlugin() ] }; ``` 代码 ```js // src/news.js import $ from 'jquery'; export default function (container) { const ul = $('