image

Access unlimited bootcamps and 650+ courses

50
%OFF
Article image
Yuri Brasil
Yuri Brasil15/09/2025 19:30
Share

Arquitetura frontend moderna

    Arquitetura frontend moderna - três principais formas de compartilhar componentes entre aplicações frontend

    image

    1 – Pacotes NPM (públicos ou privados)

    Como funciona

    • Você empacota seus componentes (React, Vue, Angular ou até vanilla) em uma biblioteca.
    • Essa lib é publicada em um registro de pacotes (npmjs, GitHub Packages, Verdaccio, Nexus etc.).
    • Qualquer aplicação que precise desses componentes instala a dependência (npm install minha-lib) e os usa normalmente.

    Vantagens

    ✅ Padronização: ótimo para compartilhar entre múltiplos projetos.

    ✅ Controle de versão: cada app escolhe qual versão usar.

    ✅ Independência: não exige repositórios ou builds integrados.

    ✅ Testado/isolado: a lib pode ter pipeline próprio de testes e versionamento sem interferir nas apps.

    Desvantagens

    ❌ Ciclo de publicação: precisa buildar e publicar cada vez que altera a lib.

    ❌ Atraso nas atualizações: os projetos consumidores precisam atualizar a versão manualmente.

    ❌ Mais fricção em times grandes: se os times não sincronizarem as versões, pode virar uma bagunça de dependências.

    Quando usar

    • Times diferentes, projetos separados, mas que compartilham design system, helpers ou hooks.
    • Libs que podem viver independentes das aplicações.

    2 – Monorepo (Lerna, Nx, Turborepo, Yarn/npm/pnpm workspaces …)

    Como funciona

    • Todas as aplicações e bibliotecas ficam em um único repositório.
    • Cada pacote (app ou lib) fica isolado, mas pode ser importado diretamente entre si.
    • Ferramentas como Nx ou Turborepo ajudam no build incremental, caching e orquestração de pipelines.

    Vantagens

    ✅ Feedback rápido: muda na lib → reflete instantaneamente nos apps.

    ✅ Facilidade de manutenção: todos os pacotes estão no mesmo lugar.

    ✅ Integração contínua: pipelines centralizados, mais controle.

    ✅ Ideal para design system: pois fica fácil manter sincronia entre apps e libs.

    Desvantagens

    ❌ Escalabilidade de repositório: repositório pode ficar enorme, lento de clonar.

    ❌ Dependência organizacional: todos precisam seguir o mesmo fluxo/git.

    ❌ Coupling: nem sempre faz sentido forçar todas as apps a viverem no mesmo repo.

    Quando usar

    • Uma organização grande com vários frontends que compartilham design system e regras comuns.
    • Times que conseguem alinhar pipeline, CI/CD e versionamento no mesmo monorepo.
    • Times de Full Stack developers

    3 – Module Federation (Webpack 5, Vite plugin, rspack …)

    Como funciona

    • É um recurso do Webpack 5 (e hoje já tem plugins para Vite, Rspack, Turbopack) que permite que um app importe código de outro app em tempo de execução (runtime).
    • Cada aplicação expõe módulos remotos (componentes, páginas, hooks, libs, etc.).
    • Outra aplicação pode consumir isso sem precisar rebuildar ou publicar pacotes.

    Vantagens

    ✅ Zero publish: não precisa repack, nem npm publish. Alterou, deployou, já está disponível.

    ✅ Maior independência de times: cada app é dono de seu deploy, mas ainda compartilha código.

    ✅ Micro frontends real: permite dividir uma aplicação em múltiplos times e ainda compor tudo no browser.

    ✅ Versões diferentes em runtime: suporta até “sharing” de libs para evitar duplicação (ex: React).

    Desvantagens

    ❌ Complexidade: configuração de Module Federation exige atenção (ex: versionamento de React).

    ❌ Acoplamento implícito: se um app remoto mudar a interface sem avisar, o consumidor quebra em tempo de execução.

    ❌ Performance: mais requests HTTP e runtime overhead. Precisa otimizar.

    Quando usar

    • Arquiteturas micro frontend distribuídas.
    • Times independentes em deploy e release, mas que ainda precisam compartilhar código em runtime.
    • Casos onde o tempo de atualização é crítico (ex: e-commerce que precisa atualizar um carrinho ou checkout sem republicar toda a app).

    image

    👉 Resumindo:

    • NPM = bom para libs reutilizáveis e independentes.
    • Monorepo = bom para time único ou organização que consegue alinhar ciclo de vida.
    • Module Federation = bom para micro frontends e times independentes que precisam compartilhar em runtime.
    Share
    Recommended for you
    Binance - Blockchain Developer with Solidity 2025
    Neo4J - Análise de Dados com Grafos
    Cognizant - Mobile Developer
    Comments (2)
    Yuri Brasil
    Yuri Brasil - 16/09/2025 23:14

    Na maioria dos casos, a definição da arquitetura de software adequada a um projeto é atribuição do arquiteto de software, profissional responsável por alinhar requisitos técnicos e de negócio às soluções disponíveis. Entretanto, na ausência desse especialista, a equipe de desenvolvimento pode assumir coletivamente essa responsabilidade, realizando uma análise criteriosa de fatores como a urgência da entrega, a disponibilidade de recursos humanos e tecnológicos, além da complexidade e do escopo do projeto.

    É importante destacar que a decisão também sofre influência direta da cultura organizacional, que pode favorecer abordagens mais centralizadas ou colaborativas. O essencial, contudo, é reconhecer previamente as diferentes possibilidades existentes, de modo a orientar o processo decisório de forma estruturada e consciente.

    DIO Community
    DIO Community - 16/09/2025 09:27

    Excelente, Yuri! Que artigo incrível e super completo sobre "Arquitetura frontend moderna"! É fascinante ver como você aborda as três principais formas de compartilhar componentes entre aplicações front-end desmistificando cada uma delas e mostrando suas vantagens e desvantagens.

    Você demonstrou que a escolha da arquitetura depende do contexto do projeto e da filosofia da equipe, o que é um insight valioso para a comunidade.

    Considerando que "a escolha entre NPM, Monorepo e Module Federation depende do contexto", qual você diria que é o maior desafio para um desenvolvedor ao decidir qual abordagem de arquitetura front-end usar para um projeto, em termos de balancear a flexibilidade com a manutenibilidade a longo prazo, em vez de apenas focar em fazer o layout funcionar?