Angular微前端中所有远程应用是否需处于同一Angular工作区?
不同代码仓库的Angular应用能否作为远程应用加载到壳应用?
完全可以。借助Angular模块联邦(Module Federation),你完全可以将分属不同代码仓库、不同工作区的Angular应用作为远程应用,加载到同一个壳应用中。只要远程应用能通过网络对外暴露其remoteEntry.js入口文件,壳应用就能完成加载集成。
以下是完整的配置示例:
壳应用配置
1. webpack.config.js
const { shareAll, withModuleFederationPlugin } = require('@angular-architects/module-federation/webpack'); module.exports = withModuleFederationPlugin({ remotes: { "appOne": "http://localhost:4201/remoteEntry.js", "appTwo": "http://localhost:4202/remoteEntry.js", }, shared: { ...shareAll({ singleton: true, strictVersion: true, requiredVersion: 'auto' }), }, });
2. main.ts
import { loadRemoteEntry } from '@angular-architects/module-federation'; import('./bootstrap') .catch(err => console.error(err)); Promise.all([ loadRemoteEntry('http://localhost:4201', 'appOne'), loadRemoteEntry('http://localhost:4202', 'appTwo'), ]) .catch((err) => console.error('Error loading remote entries', err)) .then(() => import('./bootstrap')) .catch((err) => console.error(err));
3. app-routing.module.ts(仅路由部分)
export const APP_ROUTES: Routes = [ { path: '', component: HomeComponent, pathMatch: 'full' }, { path: 'app-one', loadChildren: () => loadRemoteModule({ remoteName: 'appOne', exposedModule: './appOne', }).then((m) => m.AppOneModule) }, { path: 'app-two', loadChildren: () => loadRemoteModule({ remoteName: 'appTwo', exposedModule: './appTwo', }).then((m) => m.AppTwoModule) } ];
远程应用One配置
1. webpack.config.js
const { shareAll, withModuleFederationPlugin } = require('@angular-architects/module-federation/webpack'); module.exports = withModuleFederationPlugin({ name: 'appOne', exposes: { './appOne': './projects/app-one/src/app/app-one/app-one.module.ts', }, shared: { ...shareAll({ singleton: true, strictVersion: true, requiredVersion: 'auto' }), }, });
2. app-one.module.ts
import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { AppOneComponent } from './app-one.component'; import { AppOneRoutingModule } from './app-one-routing-module'; @NgModule({ declarations: [AppOneComponent], imports: [CommonModule, AppOneRoutingModule] }) export class AppOneModule {}
3. app-one-routing-module.ts
import { NgModule } from '@angular/core'; import { Routes, RouterModule } from '@angular/router'; import { AppOneComponent } from './app-one.component'; const routes: Routes = [{ path: '', component: AppOneComponent }]; @NgModule({ imports: [RouterModule.forChild(routes)], exports: [RouterModule], }) export class AppOneRoutingModule {}
内容的提问来源于stack exchange,提问作者Greg Lafrance
相关产品推荐
相关产品推荐

