====== Microfrontends Webpack (Module federation). ====== ===== Configuraciones ===== **Comandos** Primeramente se ejecutan los siguientes comandos ===== En cada Microfront ===== npm i @angular-architects/module-federation@18.0.6 ng g @angular-architects/module-federation:init --project remote --port 4201 --type remote **Nota:** asegurarse que el flag --project sea el nombre del angular.json ===== En host-app ===== ng g @angular-architects/native-federation:init --project host-app --port 4200 --type dynamic-host ===== Modificaciones al codigo. ===== **En cada Microfront** Crear un modulo **entry/entry.module** con las importaciones raices y un routing **entry/entry-routing.module** **Nota**: ver proyecto de referencia: (mfcajasMenores) es el primero que se configuro como microfrontend ===== Forma de exponer Microfrontends ===== Exponiendo modulo raiz de la aplicacion en **webpack.config** en este caso exponemos **entry.module.ts** y un **HeaderInterceptor** que se inyectará en la raiz del **Host** **webpack.config.js** const { shareAll, withModuleFederationPlugin } = require('@angular-architects/module-federation/webpack'); module.exports = withModuleFederationPlugin({ name: 'mfcajamenor', exposes: { './Routes': './src/app/entry/entry.module.ts', './HeaderInterceptor': './src/app/core/interceptor/header.interceptor.ts' }, shared: { ...shareAll({ singleton: true, strictVersion: true, requiredVersion: 'auto' }), }, }); Ejemplo Carga remota desde el **app.routes** del Host **.app.routes.ts** import { Routes } from '@angular/router'; import { loadRemoteModule } from '@angular-architects/module-federation'; import { environment } from '../environments/environment'; export const routes: Routes = [ { path: 'cajas-menores', loadChildren: () => loadRemoteModule({ type: 'module', remoteEntry: `${environment.mfcajas_menores_url}/remoteEntry.js`, exposedModule: './Routes' }).then(m => m.EntryModule) }, { path: 'centro-costos', loadChildren: () => loadRemoteModule({ type: 'module', remoteEntry: `${environment.mfcentro_costos_url}/remoteEntry.js`, exposedModule: './Routes' }).then(m => m.EntryModule) } ]; **Modificacion en la navegacion de los microfrontends** Anteponer el nombre del microfrontend en todos los enlaces para que pueda ser tomado por el HOST * router.navigate Asi siendo **"caja-menores/"** el nombre con el que se llamo el microfront en el path de app.routes.ts desde el HOST this._router.navigate([`/cajas-menores/gastos`]); **Se debe cargar el headerInterceptor en el app.config.ts del HOST** const loadInterceptor = async () => { const headersInterceptor = await loadRemoteModule({ type: 'module', remoteEntry: `${environment.mfcajas_menores_url}/remoteEntry.js`, exposedModule: './HeaderInterceptor' }).then(m => m.headersInterceptor); return headersInterceptor; }; // Creamos un interceptor que delegará al interceptor remoto una vez que esté cargado const delegatingInterceptor: HttpInterceptorFn = (req, next) => { return new Observable(subscriber => { loadInterceptor().then(remoteInterceptor => { remoteInterceptor(req, next).subscribe(subscriber); }); }); }; **inyectar la funcion arriba ilustrada "delegatingInterceptor()" de tipo HttpInterceptorFn asi:** provideHttpClient( withInterceptors([delegatingInterceptor]) ) [[ada:howto:sicoferp:factory:new-migracion-sicoferp:front|←Regresar]]