Quando falamos sobre modularização, é comum haver confusão com termos como componentização, especialmente para quem vem do mundo frontend usando Vue, React ou outros frameworks. Componentes são partes reutilizáveis da interface, mas modularização vai muito além disso — ela trata da organização e estruturação da aplicação como um todo, com o objetivo de separar responsabilidades, isolar funcionalidades e permitir maior escalabilidade e manutenção.

O que é um Módulo, afinal?

No desenvolvimento moderno, praticamente toda linguagem possui algum tipo de gerenciador de dependências: NPM no Node.js, Composer no PHP, Cargo no Rust, etc. E todos eles trabalham com o conceito de módulos — bibliotecas independentes que encapsulam funcionalidades específicas, como envio de e-mails, conexão com banco de dados ou implementação de um servidor HTTP.

Por outro lado, quando você começa a compor múltiplos módulos que interagem entre si, com responsabilidades bem definidas e uma arquitetura coerente, você está caminhando para algo que muitos chamam de framework.

Um exemplo é o NestJS: ele possui um core enxuto e diversos módulos opcionais, como autenticação, cache, e-mail, etc. A comunidade também pode contribuir com seus próprios módulos. Porém, mesmo com essa estrutura modular, ainda estamos falando de módulos dentro de um mesmo ecossistema — não necessariamente de uma aplicação modularizada e agnóstica no sentido mais amplo.

Modularização na Prática

Ao desenvolver o plugin de blog que você está utilizando para ler este post, optei por uma abordagem baseada no meu próprio framework: o CMMV. Diferente de muitos frameworks tradicionais, o CMMV não é apenas uma solução para backend ou API REST — ele é um ecossistema completo, que cobre backend, frontend, comunicação binária (RPC) e integrações com diversas linguagens através do conceito central de contratos.

Esses contratos não estão limitados a JavaScript ou TypeScript — embora o core seja baseado nisso — e também são utilizados em ambientes como C++ para desenvolvimento de jogos. O foco está em criar módulos agnósticos e reaproveitáveis, que podem ser consumidos por qualquer tecnologia, respeitando o contrato estabelecido.

O Caso do Blog

O sistema de blog é o primeiro grande plugin full-stack do CMMV. Ele não é apenas uma API. Ele inclui:

  • Um painel administrativo (dashboard)

  • Uma API desacoplada

  • Uma SDK que encapsula toda a lógica de comunicação

  • Suporte a múltiplos frontends

Inicialmente, implementei o frontend com Vue 3. Mas como a SDK segue um padrão agnóstico de chamadas (sem Axios, sem Fetch direto), foi possível portar facilmente para React, Angular e até JavaScript puro. Dessa forma, qualquer linguagem moderna (como Go, Dart/Flutter, etc.) pode ser usada para montar um frontend ou aplicativo mobile, sem precisar reescrever a lógica de consumo da API.

A única parte mais acoplada é a dos contratos, que por padrão são definidos em TypeScript. No entanto, nada impede que eles sejam traduzidos para outras linguagens — e é esse o ponto central: a modularização precisa permitir essa extensibilidade natural, sem forçar reescritas de código ou acoplamentos desnecessários.

SDK como Ponte Universal

Uma decisão importante no design do CMMV foi utilizar o conceito de SDKs como ponte de abstração, em vez de simplesmente expor endpoints REST e deixar o consumo por conta de cada frontend. A SDK já define como as informações devem ser processadas, exibidas ou interpretadas, mantendo consistência entre ambientes.

Esse modelo é muito similar ao que empresas como Supabase e AWS utilizam: um backend robusto, com SDKs multiplataforma bem definidas, que abstraem a complexidade das chamadas e padronizam a forma de uso da API em diferentes linguagens.

Monorepo e Escalabilidade

Outra escolha arquitetural importante foi utilizar um monorepo, com TurboRepo para orquestrar múltiplos pacotes. Isso permite:

  • Compartilhamento de código entre backend, frontend e SDKs

  • Compilações isoladas e otimizadas

  • Maior controle sobre versão, cache e builds

O TurboRepo, mantido pela equipe do Next.js, é hoje uma das melhores soluções para projetos que crescem em múltiplos pacotes. Outras soluções, como o próprio suporte a workspaces do NPM, também são úteis e ajudam na escalabilidade.

Esse padrão já é adotado por projetos como o próprio Supabase, N8N, entre muitos outros.

Conclusão

Modularizar uma aplicação vai muito além de separar arquivos ou criar pastas por funcionalidade. Envolve pensar em limites claros de responsabilidade, abstrações que se comuniquem bem entre diferentes ambientes e flexibilidade para evoluir ou mudar partes do sistema sem quebrar tudo.

Se você está criando um sistema moderno, considere:

  • Criar SDKs para encapsular comunicação com sua API

  • Utilizar monorepos com ferramentas como TurboRepo

  • Investir em contratos fortes e reutilizáveis

  • Separar UI de lógica de negócios de forma clara

Essa abordagem pode parecer trabalhosa no início, mas a longo prazo garante escalabilidade, reaproveitamento e liberdade tecnológica.