Componente de carga para Module Federation
100
100%
Does it follow best practices?
Impact
—
Average score across 4 eval scenarios
Advisory
Suggest reviewing before use
Canonical host service path (any host app in the monorepo):
src/core/api/services/module-federation/moduleFederationService.tsx
Reference implementation in this repo: ProjectBaseREACT/self-service-f/src/api/services/module-federation/ (legacy path; prefer src/core/... for new hosts).
Remote MFE example: ProjectBaseREACT/self-service-mf.
Stack: @module-federation/enhanced/runtime, @module-federation/bridge-react.
Before any page uses LoadComponent, ensure the service file exists.
src/core/api/services/module-federation/moduleFederationService.tsxRequired dependencies (host package.json — add only if absent):
"@module-federation/bridge-react": "<match project>",
"@module-federation/enhanced": "<match project>"Import in pages:
import { LoadComponent } from '@/core/api/services/module-federation/moduleFederationService';
// or relative: '../../../core/api/services/module-federation/moduleFederationService'Adjust alias (@/core) to the host’s tsconfig paths.
| Export | Role |
|---|---|
MFEConfig | { mfe, url, component, name?, type? } — mfe = remote name in MF config; component = expose key without ./ |
LoadComponent | Idempotent registerRemotes, lazy bridge load, Suspense wrapper |
createRemoteComponent | Lower-level; prefer LoadComponent in UI |
Usage:
<LoadComponent
lazyElement={{
mfe: remote.name,
url: remote.url,
component: remote.component,
type: remote.type,
}}
loading={<div>Loading …</div>}
fallback={({ error }) => <div>Error: {error.message}</div>}
router={{ navigate }}
{...hostSpecificProps}
/>Props after lazyElement forward to the remote root.
| Mode | When | lazyElement source |
|---|---|---|
| Static | Fixed blocks (profile, header widgets) | Hardcoded object in component |
| Dynamic | Lists or routes from backend | remotesService.getRemotes() / getMainRemotes() |
Static — e.g. host App.tsx profileConfig + one LoadComponent.
Dynamic — map API Remote[] to LoadComponent (stack on one page or one per <Route>).
Legacy examples: self-service-f/src/App.tsx, SelfService.tsx, mock-backend/app/api/remotes/.
Feature.remote.tsx → createBridgeComponent({ rootComponent }) — see reference.md.module-federation.config.ts → exposes: { './Feature': '.../Feature.remote.tsx' }.Host lazyElement.mfe === remote config name. Host lazyElement.component === expose key without ./.
Remote:
*.remote.tsx bridge./Feature in exposesremoteEntry.js served at host urlHost:
moduleFederationService.tsx exists under src/core/... (bootstrap if not)lazyElementLoadComponent + loading / fallbackrouter={{ navigate }} when remote navigatesmoduleFederationService.tsx after install (canonical copy in skill assets/)LoadComponent handles it)./Component in lazyElement.componentsrc/core/... already has it| File | Content |
|---|---|
| assets/moduleFederationService.tsx | Canonical static source — copy only when missing |
| examples.md | Static/dynamic host usage |
| reference.md | Remote *.remote.tsx + exposes |