11 juil. 2026
Micro-Frontends en 2026 : Architecture et Implémentation
15 min de lecture
Micro-Frontends en 2026 : Architecture et Implémentation
Les micro-frontends appliquent le principe de séparation du backend aux frontends. Chaque équipe déploie son bout indépendamment.
Quand utiliser les micro-frontends ?
| Situation | Micro-frontends ? |
|---|---|
| 3+ équipes sur le même produit | ✅ Oui |
| Déploiements indépendants nécessaires | ✅ Oui |
| Stack technique hétérogène | ✅ Oui |
| Petite équipe (< 5 devs) | ❌ Non |
| Application simple | ❌ Non |
Architecture Module Federation
// webpack.config.ts — Shell (host)
import { ModuleFederationPlugin } from 'webpack/lib/container/ModuleFederationPlugin';
export default {
plugins: [
new ModuleFederationPlugin({
name: 'shell',
remotes: {
header: 'header@https://header.example.com/remoteEntry.js',
products: 'products@https://products.example.com/remoteEntry.js',
cart: 'cart@https://cart.example.com/remoteEntry.js'
},
shared: {
react: { singleton: true, requiredVersion: '^18' },
'react-dom': { singleton: true, requiredVersion: '^18' }
}
})
]
};
Shell (Host)
// src/App.tsx
import React, { Suspense, lazy } from 'react';
const Header = lazy(() => import('header/App'));
const Products = lazy(() => import('products/App'));
const Cart = lazy(() => import('cart/App'));
function Loading() {
return <div className="skeleton skeleton-header" />;
}
export default function Shell() {
return (
<div className="app">
<Suspense fallback={<Loading />}>
<Header />
</Suspense>
<main className="content">
<Suspense fallback={<Loading />}>
<Products />
</Suspense>
</main>
<aside className="sidebar">
<Suspense fallback={<Loading />}>
<Cart />
</Suspense>
</aside>
</div>
);
}
Module Micro-Frontend
// products/webpack.config.ts
new ModuleFederationPlugin({
name: 'products',
filename: 'remoteEntry.js',
exposes: {
'./App': './src/App',
'./ProductCard': './src/components/ProductCard'
},
shared: {
react: { singleton: true },
'react-dom': { singleton: true }
}
});
Communication entre modules
// Événements custom pour la communication
class MicroFrontendBus {
private static instance: MicroFrontendBus;
static getInstance() {
if (!this.instance) this.instance = new MicroFrontendBus();
return this.instance;
}
emit(event: string, data: any) {
window.dispatchEvent(new CustomEvent(`mf:${event}`, { detail: data }));
}
on(event: string, handler: Function) {
const wrapper = (e: Event) => handler((e as CustomEvent).detail);
window.addEventListener(`mf:${event}`, wrapper);
return () => window.removeEventListener(`mf:${event}`, wrapper);
}
}
// Cart écoute les ajouts de Products
const bus = MicroFrontendBus.getInstance();
bus.on('product:add', (product) => {
addItemToCart(product);
});
Déploiement indépendant
# Chaque micro-frontend a son propre pipeline
name: Deploy Products
on:
push:
branches: [main]
paths: ['products/**']
jobs:
deploy:
runs-on: ubuntu-latest
defaults:
run:
working-directory: products
steps:
- uses: actions/checkout@v4
- run: npm ci
- run: npm test
- run: npm run build
- run: aws s3 sync dist/ s3://mf-products-prod/ --delete
Avantages mesurés
| Métrique | Monolith | Micro-Frontends |
|---|---|---|
| Deploy time | 15 min | 2 min |
| Rollback time | 15 min | 1 min |
| Team autonomy | Dépendante | Indépendante |
| Build time | 8 min | 2 min par module |
Conclusion
Micro-frontends = autonomie d'équipe x déploiement indépendant. Commencez par extraire un module, pas tout d'un coup.