webpack5 module federation 模块联邦

90 阅读1分钟

webpack5 module federation 模块联邦

简单实现微服务项目

创建 react 项目

npx create-react-app '项目名'
<!-- 消费方-主服务 -->
npx create-react-app container
<!-- 提供方-子服务 -->
npx create-react-app micro-front-end-1
npx create-react-app micro-front-end-2

改造提供方-子服务

安装依赖

yarn add webpack webpack-cli webpack-server html-webpack-plugin webpack-dev-server -D

创建配置文件修改配置

  • 创建 webpack.config.js
module.exports = {
  mode: "development",
  //   服务信息
  devServer: {
    port: 8081,
  },
  // react项目需要配置
  module: {
    rules: [
      {
        test: /\.js?$/,
        exclude: /node_modules/,
        loader: "babel-loader",
        options: {
          presets: [
            "@babel/preset-env", // 将高级语法转译至 ES5
            "@babel/preset-react", // 编译react语法至 ES5
          ],
        },
      },
    ],
  },
  //   插件
  plugins: [
    // 项目入口文件
    new HtmlWebpackPlugin({
      template: "./public/index.html",
    }),
    // 暴露服务,提供访问文件
    new ModuleFederationPlugin({
      // 服务名称
      name: "microFrontEnd1",
      // 其他服务访问的文件名
      filename: "remoteEntry.js",
      // 暴露的文件
      exposes: {
        "./MicroFrontEnd1Index": "./src/index",
      },
    }),
  ],
};
  • package.json 加入 script
"scripts":{
    "webpack":'webpack serve'
}

改造主服务

安装依赖

yarn add webpack webpack-cli webpack-server html-webpack-plugin -D

创建配置文件修改配置

  • 创建 webpack.config.js
module.exports = {
  mode: "development",
  //   服务信息
  devServer: {
    port: 8081,
  },
  //   插件
  plugins: [
    // 项目入口文件
    new HtmlWebpackPlugin({
      template: "./public/index.html",
    }),
    // 引入子服务
    new ModuleFederationPlugin({
      // 当前服务名
      name: "container",
      //   子服务
      remotes: {
        // 子服务配置的[name]:[name]@[子服务完整访问地址][filename].js
        microFrontEnd1: "microFrontEnd1@http://localhost:8081/remoteEntry.js",
      },
    }),
  ],
};
  • package.json 加入 script
"scripts":{
    "webpack":'webpack serve'
}
  • 引入子服务
import "microFrontEnd1/MicroFrontEnd1Index";
  • 在主服务增加子服务显示视图,定义 id,与子服务加载内容的 id 保持一致
<!-- 主服务配置挂载子服务id -->
<html lang="en">
  <head> </head>
  <body>
    <div id="root"></div>
    <div id="react-microfrontend-2"></div>
  </body>
</html>
// 子服务加载内容视图
const root = ReactDOM.createRoot(
  document.getElementById("react-microfrontend-2")
);