Angular微前端架构:Module Federation + ngx-build-plus (Webpack)

以下是一个完整的 Angular 微前端示例,其中使用的是 Module Federation 和 npx-build-plus 实现了主应用(Shell)与子应用(Remote)的集成。

🛠️ 项目结构

复制代码
angular-mf/
├── shell-app/       # 主应用(Shell)
├── remote-app/      # 子应用(Remote)
├── angular.json     # Angular CLI 配置
└── package.json     # 项目依赖

1️⃣ 安装依赖

首先,确保你已安装 npx-build-plus:

复制代码
ng add ngx-build-plus

然后,安装 @angular-architects/module-federation:

复制代码
npm install @angular-architects/module-federation --save-dev

2️⃣ 配置 Remote 应用(子应用)

在remote-app/webpack.config.js 中,配置ModuleFederationPlugin:

复制代码
const { ModuleFederationPlugin } = require('webpack').container;

module.exports = {
  output: {
    uniqueName: 'remoteApp',
    publicPath: 'auto',
  },
  plugins: [
    new ModuleFederationPlugin({
      name: 'remoteApp',
      filename: 'remoteEntry.js',
      exposes: {
        './RemoteModule': './src/app/remote/remote.module.ts',
      },
      shared: {
        '@angular/core': { singleton: true, strictVersion: true },
        '@angular/common': { singleton: true, strictVersion: true },
        '@angular/router': { singleton: true, strictVersion: true },
      },
    }),
  ],
};

3️⃣ 配置 Shell 应用(主应用)

在 shell-app/webpack.config.js 中,配置ModuleFederationPlugin:

复制代码
const { ModuleFederationPlugin } = require('webpack').container;

module.exports = {
  output: {
    uniqueName: 'shellApp',
  },
  plugins: [
    new ModuleFederationPlugin({
      name: 'shellApp',
      remotes: {
        remoteApp: 'remoteApp@http://localhost:4201/remoteEntry.js',
      },
      shared: {
        '@angular/core': { singleton: true, strictVersion: true },
        '@angular/common': { singleton: true, strictVersion: true },
        '@angular/router': { singleton: true, strictVersion: true },
      },
    }),
  ],
};

4️⃣ 配置 Angular.json File + Angular 路由

angular.json文件配置如下:angular.json 配置的关键部分是如何集成 npx-build-plus 以支持 Webpack Module Federation。

angular.json 配置说明

🧭 关键修改目标

  1. 使用 npx-build-plus 替代默认@angular-devkit/build-angular:browser

  2. 添加extraWebpackConfig 指向自定义的 Webpack 配置文件

  3. 配置输出格式(如 umdModules(非必须)、outputPath)

📁 angular.json 配置片段

复制代码
{
  "projects": {
    "shell-app": {
      "architect": {
        "build": {
          "builder": "ngx-build-plus:browser",
          "options": {
            "outputPath": "dist/shell-app",
            "index": "src/index.html",
            "main": "src/main.ts",
            "polyfills": "src/polyfills.ts",
            "tsConfig": "tsconfig.app.json",
            "aot": true,
            "assets": ["src/favicon.ico", "src/assets"],
            "styles": ["src/styles.scss"],
            "scripts": [],
            "extraWebpackConfig": "webpack.config.js",
            "umdModuleIds": {
              "@angular/core": "ng.core",
              "@angular/common": "ng.common",
              "@angular/router": "ng.router"
            }
          },
          "configurations": {
            "production": {
              "optimization": true,
              "outputHashing": "all",
              "sourceMap": false,
              "extractCss": true,
              "namedChunks": false,
              "fileReplacements": [
                {
                  "replace": "src/environments/environment.ts",
                  "with": "src/environments/environment.prod.ts"
                }
              ]
            }
          }
        },
        "serve": {
          "builder": "ngx-build-plus:dev-server",
          "options": {
            "browserTarget": "shell-app:build"
          },
          "configurations": {
            "production": {
              "browserTarget": "shell-app:build:production"
            }
          }
        }
      }
    }
  }
}

📦 额外建议

  • 确保webpack.config.js 文件存在于根目录或指定位置。

  • 如果你有多个环境配置(如 staging/test),也可以扩展configurations 。

  • 如果你使用webpack.prod.config.js,可以在生产配置中加上extraWebpackConfig 覆盖。

在shell-app/src/app/app-routes.ts 中,配置动态加载 Remote 模块:

复制代码
import { Routes } from '@angular/router';
import { loadRemoteModule } from '@angular-architects/module-federation';

export const routes: Routes = [
  {
    path: 'remote',
    loadChildren: () =>
      loadRemoteModule({
        remoteName: 'remoteApp',
        exposedModule: './RemoteModule',
      }).then((m) => m.RemoteModule),
  },
];

5️⃣ 启动应用

分别启动 Remote 和 Shell 应用:

复制代码
# 启动 Remote 应用
cd remote-app
ng serve --port 4201

# 启动 Shell 应用
cd shell-app
ng serve --port 4200

访问 http://localhost:4200/remote 即可加载 Remote 模块。


✅ 总结

  • 使用 Webpack 5 的 ModuleFederationPlugin 实现了主应用与子应用的动态模块共享。

  • 通过npx-build-plus扩展了 Angular CLI 的构建功能,支持自定义 Webpack 配置。

  • 采用@angular-architects/module-federation提供的 loadRemoteModule实现了 Angular 路由的懒加载远程模块。

相关推荐
jiangzhihao05151 天前
前端自动翻译插件webpack-auto-i18n-plugin的使用
前端·webpack·node.js
软件技术NINI1 天前
html css网页制作成品——HTML+CSS盐津铺子网页设计(5页)附源码
前端·css·html
mapbar_front1 天前
面试问题—我的问题问完了,你还有什么想问我的吗?
前端·面试
quweiie1 天前
thinkphp8+layui多图上传,带删除\排序功能
前端·javascript·layui
李鸿耀1 天前
React 项目 SVG 图标太难管?用这套自动化方案一键搞定!
前端
闲蛋小超人笑嘻嘻1 天前
树形结构渲染 + 选择(Vue3 + ElementPlus)
前端·javascript·vue.js
叶梅树1 天前
从零构建A股量化交易工具:基于Qlib的全栈系统指南
前端·后端·算法
巴博尔1 天前
uniapp的IOS中首次进入,无网络问题
前端·javascript·ios·uni-app
Asthenia04121 天前
技术复盘:从一次UAT环境CORS故障看配置冗余的危害与最佳实践
前端
csj501 天前
前端基础之《React(1)—webpack简介》
前端·react