Começando com Nx para Gerenciamento de Monorepo

Gerenciar múltiplos projetos relacionados pode rapidamente se tornar complexo. À medida que sua base de código cresce, você precisa de ferramentas que ajudem a manter consistência, compartilhar código eficientemente e otimizar tempos de build. O Nx é uma solução poderosa projetada especificamente para esses desafios.
Este guia mostrará como configurar e usar o Nx para gerenciar um monorepo efetivamente. Você aprenderá os conceitos fundamentais, criará um workspace básico e entenderá como as funcionalidades inteligentes do Nx podem melhorar drasticamente seu fluxo de trabalho de desenvolvimento.
Principais Pontos
- O Nx simplifica o gerenciamento de monorepo com poderoso rastreamento de dependências, cache e geração de código
- Gráficos de projetos ajudam a visualizar relacionamentos entre componentes em sua base de código
- Comandos affected economizam tempo ao construir e testar apenas o que mudou
- Bibliotecas compartilhadas permitem reutilização eficiente de código entre aplicações
- Cache inteligente acelera drasticamente builds tanto em ambientes de desenvolvimento quanto de CI
O que é um Monorepo?
Um monorepo é uma estratégia de controle de versão onde múltiplos projetos são armazenados em um único repositório. Diferente de ter repositórios separados para cada projeto (polyrepo), um monorepo contém todos os projetos relacionados em um só lugar.
Benefícios dos Monorepos
- Compartilhamento de código - Reutilize código entre projetos sem gerenciamento complexo de pacotes
- Mudanças atômicas - Atualize múltiplos projetos em um único commit
- Ferramentas consistentes - Aplique os mesmos padrões de desenvolvimento em todos os projetos
- Dependências simplificadas - Gerencie relacionamentos de projetos em um só lugar
- Releases coordenados - Sincronize atualizações entre projetos interdependentes
No entanto, monorepos introduzem desafios como gerenciar dependências de build e escalar conforme sua base de código cresce. É aqui que o Nx entra em cena.
O que é o Nx?
Nx é um sistema de build extensível projetado especificamente para gerenciamento de monorepo. Originalmente desenvolvido para aplicações Angular, o Nx agora suporta múltiplos frameworks frontend e backend incluindo React, Vue, Node.js e mais.
Principais Funcionalidades do Nx
- Cache inteligente - Evita reconstruir código inalterado
- Gráfico de dependências - Visualiza relacionamentos entre projetos
- Comandos affected - Constrói e testa apenas o que foi impactado por suas mudanças
- Geradores de código - Cria estruturas de projeto consistentes
- Plugins extensíveis - Suporta vários frameworks e ferramentas
Configurando Seu Primeiro Workspace Nx
Vamos criar um workspace Nx básico com uma aplicação React e uma biblioteca compartilhada.
Pré-requisitos
- Node.js (v14 ou posterior)
- npm ou yarn
Criando um Workspace Nx
# Instalar o CLI do Nx globalmente (opcional)
npm install -g nx
# Criar um novo workspace
npx create-nx-workspace@latest my-workspace
Durante a configuração, você será solicitado a escolher:
- Qual stack usar (selecione “React”)
- Nome da aplicação (ex: “web-app”)
- Formato de estilo (CSS, SCSS, etc.)
- Configuração do Nx Cloud (opcional mas recomendado para projetos em equipe)
Isso cria um workspace com a seguinte estrutura:
my-workspace/
├── apps/
│ └── web-app/
├── libs/
├── nx.json
├── package.json
└── tsconfig.base.json
Entendendo a Estrutura do Workspace
- apps/ - Contém suas aplicações (frontend, backend, mobile)
- libs/ - Mantém bibliotecas de código compartilhado usadas entre aplicações
- nx.json - Configura comportamento e plugins do Nx
- package.json - Gerencia dependências para todo o workspace
Adicionando Projetos ao Seu Workspace
Agora vamos adicionar uma biblioteca de UI compartilhada e ver como o Nx gerencia dependências.
Criando uma Biblioteca Compartilhada
nx g @nx/react:lib ui-components
Isso cria uma biblioteca em libs/ui-components/
que pode ser importada por qualquer aplicação em seu workspace.
Criando um Componente na Biblioteca
nx g @nx/react:component button --project=ui-components --export
Isso gera um componente Button em sua biblioteca de UI e o exporta para uso em outros projetos.
Usando a Biblioteca em Sua Aplicação
Edite sua aplicação para usar o novo componente:
// apps/web-app/src/app/app.tsx
import { Button } from '@my-workspace/ui-components';
export function App() {
return (
<div>
<h1>Welcome to My App</h1>
<Button>Click me</Button>
</div>
);
}
Executando Tarefas com Nx
O Nx fornece uma maneira unificada de executar tarefas em seus projetos.
Comandos Comuns
# Iniciar o servidor de desenvolvimento
nx serve web-app
# Construir a aplicação
nx build web-app
# Executar testes
nx test web-app
# Fazer lint do código
nx lint web-app
Executando Tarefas para Todos os Projetos
nx run-many --target=build --all
Aproveitando as Funcionalidades Inteligentes do Nx
O poder do Nx se torna aparente conforme seu workspace cresce. Vamos explorar suas funcionalidades mais valiosas.
Visualizando Dependências de Projetos
nx graph
Isso abre uma visualização interativa das dependências de seus projetos, ajudando você a entender a arquitetura do seu monorepo.
Entendendo Projetos Afetados
Quando você faz mudanças, o Nx pode determinar quais projetos são afetados:
nx affected:graph
Isso mostra apenas os projetos impactados por suas mudanças recentes.
Construindo Apenas o que Mudou
nx affected --target=build
Isso constrói apenas os projetos afetados por suas mudanças, economizando tempo significativo em pipelines de CI/CD.
Cache para Velocidade
O Nx automaticamente faz cache dos resultados de tarefas. Se você executar a mesma tarefa com as mesmas entradas, o Nx usa o resultado em cache ao invés de executá-la novamente:
# Primeira execução (executa a tarefa)
nx build web-app
# Segunda execução (usa cache)
nx build web-app
Configuração do Workspace Nx
O arquivo nx.json
controla como o Nx se comporta. Aqui está uma configuração básica:
{
"npmScope": "my-workspace",
"affected": {
"defaultBase": "main"
},
"tasksRunnerOptions": {
"default": {
"runner": "nx/tasks-runners/default",
"options": {
"cacheableOperations": ["build", "lint", "test", "e2e"]
}
}
},
"targetDefaults": {
"build": {
"dependsOn": ["^build"]
}
}
}
Configurações principais:
- npmScope - O prefixo para importar bibliotecas
- affected.defaultBase - A branch git para comparar
- cacheableOperations - Tarefas que devem ser cacheadas
- dependsOn - Dependências de tarefas (ex: construir bibliotecas antes de aplicações)
Exemplo do Mundo Real: Aplicação Full-Stack
Vamos criar um exemplo mais completo com um frontend React e backend Node.js:
# Criar uma app React
nx g @nx/react:app client
# Criar uma API Node.js
nx g @nx/node:app api
# Criar uma biblioteca de tipos compartilhados
nx g @nx/js:lib shared-types
Isso te dá um workspace com:
- Uma aplicação cliente React
- Um servidor API Node.js
- Uma biblioteca compartilhada para tipos comuns
Você pode executar ambas as aplicações simultaneamente:
nx run-many --target=serve --projects=api,client --parallel
Conclusão
O Nx torna o gerenciamento de monorepo direto e eficiente. Ao lidar com a complexidade de dependências de projetos e otimização de build, ele permite que você se concentre em escrever código ao invés de gerenciar a estrutura do seu repositório. Comece com uma configuração simples como mostrado neste guia, e expanda conforme seu projeto cresce.
Perguntas Frequentes
O Nx fornece funcionalidades mais avançadas como cache de computação, comandos affected e geração de código. Também oferece melhores ferramentas de visualização e suporta mais frameworks prontos para uso.
Sim, o Nx fornece ferramentas para adotá-lo incrementalmente em projetos existentes. Você pode começar adicionando o Nx ao seu repositório e gradualmente movendo projetos para a estrutura de workspace do Nx.
Sim, o Nx funciona com todos os principais sistemas de CI/CD. Ele fornece integrações específicas para GitHub Actions, CircleCI e outros para otimizar tempos de build usando suas funcionalidades de cache.
O Nx suporta tanto versionamento unificado (todos os projetos compartilham a mesma versão) quanto versionamento independente (cada projeto tem sua própria versão) através de plugins como @nx/npm-package.
Embora o Nx funcione melhor com JavaScript e TypeScript, ele suporta outras linguagens através de plugins. Há suporte crescente para Go, Python e outras linguagens.
Sim, o Nx pode ser usado para projetos standalone para aproveitar suas funcionalidades de cache, execução de tarefas e geração de código, mesmo sem múltiplos projetos.