本项目使用的 angular 是 15.2.8 版本的,npm i @angular/cli@15.2.8 -g
为了好演示,两个项目就放在了一个 git 仓库中,但是两个不同仓库的项目也是可以使用的,原理是一样的
1. 创建环境
-
创建一个没有项目的空壳子
ng new shell --create-application=false -
进入到项目文件夹中,添加主应用和子应用 1
ng g application main ng g application mfe1 -
安装
@angular-architects/module-federationnpm i @angular-architects/module-federation@15 -D -
初始化主项目和子项目
ng g @angular-architects/module-federation:init --project main --port 9000 ng g @angular-architects/module-federation:init --project mfe1 --port 9001
到现在为止两个项目都创建好了,webpack 的 module federation 也都安装到两个项目中了,接下来要把 mfe1 项目的 AppModule 要暴露出来给 main 项目使用了
2. 把 mfe1 项目的 AppModule 暴露出来
-
配置 mf1 webpack.config.js,
/* * mfe1 * webpack.config.js */ name: "mfe1", filename: "remoteEntry.js", exposes: { './AppModule': './projects/mfe1/src/app/app.module.ts', },
3. 在 main 项目中进行配置路由
-
在 AppComponent 中使用
/* * main * app.component.html */ <p>main app work!</p> <router-outlet></router-outlet> /* * main * app.component.ts */ constructor(private router: Router) { this.router.resetConfig([ { path: 'mfe1', loadChildren: () => loadRemoteModule({ type: 'module', remoteEntry: 'http://localhost:9001/remoteEntry.js', exposedModule: './AppModule', }).then((m) => this.loadRemoteRootModule(m)), } ]); } loadRemoteRootModule(m: any) { const appModuleImports = m.AppModule.ɵinj.imports; const appRoutingModule = appModuleImports.find( (i: any) => i.name === 'AppRoutingModule' ); const appRoutingModuleImports = appRoutingModule.ɵinj.imports; appRoutingModuleImports[0].providers = [ appRoutingModuleImports[0].providers[2], ]; appRoutingModuleImports[0].providers[0].useValue = [ { path: '', component: m.AppModule.ɵmod.bootstrap[0], children: appRoutingModuleImports[0].providers[0].useValue, }, ]; return m.AppModule; }
4. 起服务,看效果
我在 mfe1 中加了一个用来测试的路由组件,访问 http://localhost:9000/mfe1/test
const routes: Routes = [
{
path: "test",
component: TestComponent,
},
];
接下来就可以看成品了,可以看出,路由生效了,并且子项目的路由很好的展现了