Micro Frontends dividem uma aplicação monolítica em partes menores, cada uma desenvolvida, testada e implantada de forma independente. O Module Federation do Webpack 5 fornece a infraestrutura necessária para que diferentes builds compartilhem módulos em tempo de execução, permitindo que equipes trabalhem de forma desacoplada.
Por que adotar Micro Frontends?
- Escalabilidade organizacional, times podem entregar funcionalidades de forma autônoma.
- Deploy independente, atualizações de um módulo não requerem rebuild de toda a aplicação.
- Reuso de componentes, bibliotecas compartilhadas são carregadas apenas uma vez.
- Performance, carregamento sob demanda (lazy loading) reduz o tamanho inicial do bundle.
Conceitos chave do Module Federation
| Conceito | Descrição |
|---|---|
| Host | Aplicação que consome módulos remotos. |
| Remote | Aplicação que expõe módulos via exposes. |
| Shared | Dependências (React, lodash) que são carregadas uma única vez. |
| Dynamic Remotes | Carregamento de remotes em tempo de execução via import(). |
Configuração básica (Webpack), 5 linhas
// host/webpack.config.js module.exports = { plugins: [new ModuleFederationPlugin({ name: 'host', remotes: { remote: 'remote@https://example.com/remoteEntry.js' }, shared: { react: { singleton: true }, "react-dom": { singleton: true } } })] };
// remote/webpack.config.js module.exports = { plugins: [new ModuleFederationPlugin({ name: 'remote', filename: 'remoteEntry.js', exposes: { './Button': './src/Button' }, shared: { react: { singleton: true }, "react-dom": { singleton: true } } })] };
Cada aplicação tem seu próprio
webpack.config.js; o host importa o módulo remoto comoremote/Button.
Consumo de módulo remoto (React), 3 linhas
import React, { Suspense } from 'react'; const RemoteButton = React.lazy(() => import('remote/Button')); export default () => <Suspense fallback="Carregando…"><RemoteButton /></Suspense>;
O React.lazy garante lazy loading do componente remoto, reduzindo o bundle inicial.
Estratégias de versionamento de dependências
- Singleton, garante que apenas uma cópia de React seja carregada.
- Strict Version, use
requiredVersionpara evitar incompatibilidades. - Fallback, configure
fallback: 'path/to/local/react'caso o remote falhe.
Deploy e CI/CD
- Build separado, cada micro-frontend tem seu pipeline (
npm run build). - Publicação, faça upload dos assets (
remoteEntry.js, bundles) para um CDN. - Cache busting, inclua hash no nome do arquivo (
remoteEntry.[contenthash].js). - Feature flags, habilite/disable remotes via configuração no host.
Boas-práticas de performance
- Chunk splitting, use
splitChunkspara extrair libs compartilhadas. - Prefetch/Preload,
<link rel="prefetch" href="remoteEntry.js">para melhorar tempo de carregamento. - Tree shaking, assegure que apenas módulos usados sejam incluídos.
- Monitoramento, rastreie tamanho dos bundles com
webpack-bundle-analyzer.
Segurança
- CORS, configure cabeçalhos
Access-Control-Allow-Originnos assets remotos. - Integridade, use Subresource Integrity (
integrityattribute) ao carregarremoteEntry.js. - Sandbox, limite o escopo dos remotes via CSP (
script-src,object-src).
Checklist rápido
- Configurar
ModuleFederationPluginno host e nos remotes. - Definir
sharedpara dependências críticas (React, lodash). - Implementar lazy loading com
React.lazyouimport(). - Publicar
remoteEntry.jsem CDN com hash. - Configurar CI/CD para build e deploy independentes.
- Testar fallback de remote offline.
- Monitorar tamanho dos bundles e performance.
- Aplicar CSP e SRI para segurança.
Conclusão
Module Federation traz modularidade e escala organizacional ao mundo dos front-ends, permitindo que equipes entreguem funcionalidades de forma independente, mantendo uma experiência de usuário coesa e performática. Ao seguir as boas-práticas de configuração, versionamento de dependências e CI/CD, seu time pode evoluir rapidamente sem comprometer a qualidade.
Já implementou micro frontends? Compartilhe suas experiências nos comentários!
Leia também
- Micro-frontends: Quando e Por Que Adotar em Projetos Escaláveis
- Componentes Web com Lit: Guia Prático para UI Reutilizável
- Feature Flags: Guia Completo para Releases Seguros
- Acessibilidade Web (A11y): Guia Prático para Desenvolvedores
- Cache e streaming no Next.js: performance virou decisão de arquitetura
- Performance Web: Otimizando React Applications para Alta Performance
