Herramientas de usuario

Herramientas del sitio


ada:howto:sicoferp:factory:new-migracion-sicoferp:front:configuracion-microfrontend

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])
  )
    

←Regresar

ada/howto/sicoferp/factory/new-migracion-sicoferp/front/configuracion-microfrontend.txt · Última modificación: 2025/01/31 15:03 por 192.168.175.192