Gestión de errores en el renderizado de módulos remotos en Module Federation.
Contexto
El proceso de carga de un módulo remoto puede fallar por un error al cargar recursos de red o por un error de renderizado en la lógica de negocio.
Aunque el Runtime de Module Federation proporciona información detallada en los logs de errores y hooks de runtime para ayudarte a localizar la causa del fallo de carga, necesitamos añadir un mecanismo de fallback ante errores para garantizar la estabilidad de todo el sitio y evitar que este se caiga por completo debido al fallo de renderizado de un módulo remoto.
Solución
Para construir un mecanismo robusto de carga de módulos remotos, podemos abordar los posibles problemas en los siguientes tres niveles:
Para las siguientes soluciones, puedes consultar los ejemplos de router-demo.
Capa de red: mecanismo de reintentos
Usa el plugin @module-federation/retry-plugin para gestionar los problemas relacionados con la red:
-
Reintenta automáticamente las solicitudes de recursos fallidas
-
Número de reintentos e intervalo configurables
-
Admite estrategias personalizadas de gestión de errores
Capa de carga: hook de gestión de errores
Usa el hook errorLoadRemote que proporciona el Runtime de Module Federation para una gestión de errores más granular:
- Captura errores en las distintas fases del ciclo de vida de la carga
- Proporciona un componente de fallback o un recurso de respaldo
- Admite estrategias personalizadas de gestión de errores
Capa de renderizado: error boundary
Usa el mecanismo ErrorBoundary de React para gestionar las excepciones de renderizado de componentes:
- Degradación elegante, mostrando mensajes de error amigables
- Aísla el impacto de los errores y evita que toda la aplicación se caiga
- Admite la recuperación de errores y el reintento de la carga
Estas tres soluciones están pensadas para escenarios distintos; puedes usarlas por separado o combinarlas para obtener un mecanismo de gestión de errores más completo. A continuación presentamos en detalle la implementación concreta de cada una.
Añadir un mecanismo de reintentos
Ante entornos con una red débil o cuando el producer aún no ha iniciado el servicio, podemos añadir un mecanismo de reintentos para solicitar los recursos varias veces, lo que aumenta la probabilidad de que se carguen correctamente.
Module Federation ofrece oficialmente el plugin de reintentos @module-federation/retry-plugin, que proporciona un mecanismo de reintentos para recursos y admite reintentar tanto recursos fetch como script.
Registro solo en runtime
Para más información sobre la configuración de parámetros de @module-federation/retry-plugin, consulta la documentación
Registro mediante plugin
El resultado es el siguiente:


Hook errorLoadRemote
Los errores que se producen durante el proceso de carga de módulos remotos pueden capturarse en el hook errorLoadRemote.
errorLoadRemote es el hook de gestión de errores del Runtime de Module Federation. Se activa cuando falla la carga de un módulo remoto. Está diseñado para dispararse cuando la carga del módulo falla en las distintas fases del ciclo de vida y te permite personalizar las estrategias de gestión de errores.
errorLoadRemote admite devolver un componente de fallback ante el error, y también devolver un contenido de recurso concreto para garantizar que los procesos posteriores se rendericen con normalidad.
Dividimos el uso del registro y la carga de módulos en "solo runtime + import dinámico" y "registro mediante plugin + import síncrono".
Solo runtime + import dinámico
Cuando se usa el registro solo en runtime, el módulo remoto no solicita recursos hasta después del registro.
Usa el hook errorLoadRemote para capturar los errores de carga de módulos remotos (incluidos los errores de carga de recursos); admite devolver un componente de fallback errorBoundary.
El resultado es el siguiente:


Registro mediante plugin + import síncrono
El registro mediante plugin admite el uso de import síncrono para cargar módulos, y la solicitud de recursos se produce antes que con el registro solo en runtime, por lo que necesitamos registrar el hook errorLoadRemote en el plugin.
El siguiente ejemplo muestra cómo gestionar los errores en las distintas fases del ciclo de vida.
Si el escenario de tu aplicación es sencillo, puedes consultar la versión simplificada que aparece más abajo, que ofrece una solución unificada de gestión de errores.
-
Import síncrono en
App.tsx:import Remote1App from 'remote1/app'; -
Acerca de
fallback.ts:-
El hook
errorLoadRemoterecibe un parámetroargsque contiene la información detallada del error. Medianteargs.lifecyclepodemos determinar la fase en la que se produjo el error y aplicar la estrategia de gestión correspondiente: -
Gestionar errores de carga de componentes (
args.lifecycle === 'onLoad')- Este tipo de error se produce en el proceso de carga de módulos distinto de la carga del recurso de entrada
mf-manifest.json - Podemos devolver un componente de fallback con estilos:
- Este tipo de error se produce en el proceso de carga de módulos distinto de la carga del recurso de entrada
-
Gestionar errores de carga del archivo de entrada (
args.lifecycle === 'afterResolve')- Este tipo de error se produce durante la carga del recurso de entrada
mf-manifest.json - Podemos gestionarlo de las dos maneras siguientes:
a. Intentar cargar un servicio de respaldo:
b. Usar un recurso de respaldo local:
- Este tipo de error se produce durante la carga del recurso de entrada
-
Versión simplificada
Si no necesitas distinguir entre tipos de error, también puedes usar una solución genérica de gestión de errores:
-
El resultado es el siguiente:


Configurar un ErrorBoundary para el componente
El ErrorBoundary de React es la última línea de defensa para gestionar los errores a nivel de componente. En escenarios de carga dinámica de módulos remotos (como la carga diferida), puede ayudarnos a capturar y procesar los errores de renderizado de los módulos remotos y ofrecer una degradación elegante.
Configurar un ErrorBoundary para los componentes es adecuado en escenarios de import dinámico de módulos remotos, como la carga diferida.
Además, tras configurar un ErrorBoundary para los componentes, puedes evitar depender del hook errorLoadRemote para el fallback ante errores, ya que se trata de una funcionalidad del propio React para proporcionar un fallback de errores a tus componentes.
- Import dinámico del módulo remoto en
App.tsx
El resultado es el siguiente:

