Blog
Microfrontends arquivo

PNPM Catalogs: catálogo central de versões recomendadas para microfrontends

Como usar PNPM Catalogs para padronizar dependências entre projetos, melhorar governança e organizar versões por categoria em cenários de microfrontends e monorepos.

Tenho usado o pnpm catalogs como estratégia para padronizar e categorizar dependências entre projetos, e tem funcionado muito bem, principalmente em contextos com múltiplos repositórios ou monorepos.

A ideia é simples: criar um catálogo com versões recomendadas das dependências e consumi-las via catalog:<nome> nos projetos.

Como funciona

Exemplo no pnpm-workspace.yaml:

catalogs:
  core:
    react: ^18.2.0
    axios: ^1.6.0
  lint:
    eslint: ^8.57.0
    prettier: ^3.2.5
  test:
    vitest: ^1.5.0
    cypress: ^13.0.0

E no package.json dos projetos:

{
  "dependencies": {
    "react": "catalog:core",
    "axios": "catalog:core"
  },
  "devDependencies": {
    "eslint": "catalog:lint",
    "vitest": "catalog:test"
  }
}

O que isso resolve na prática

1. Padronização de versões

  • ✅ Versões consistentes entre múltiplos times
  • ✅ Evita conflitos de dependências
  • ✅ Facilita debugging e troubleshooting

2. Organização por categoria

  • ✅ Dependências agrupadas por tipo de uso (core, test, lint, etc.)
  • ✅ package.json mais semântico e legível
  • ✅ Separação clara entre runtime e dev dependencies

3. Governança melhorada

  • ✅ Upgrades centralizados e controlados
  • ✅ Auditorias facilitadas de segurança
  • ✅ Evita acoplamentos desnecessários

4. Developer experience

  • ✅ Instalação simplificada com pnpm install
  • ✅ Resolução automática de versões
  • ✅ Integração com VSCode via extensão

Configuração prática

1. Estrutura do workspace

# pnpm-workspace.yaml
packages:
  - 'apps/*'
  - 'packages/*'
  - 'microfrontends/*'

catalogs:
  # Dependências principais do projeto
  core:
    react: ^18.2.0
    react-dom: ^18.2.0
    axios: ^1.6.0
    lodash: ^4.17.21
  
  # Ferramentas de desenvolvimento
  dev:
    typescript: ^5.3.0
    vite: ^5.0.0
    @types/node: ^20.10.0
  
  # Linting e formatação
  lint:
    eslint: ^8.57.0
    prettier: ^3.2.5
    @typescript-eslint/eslint-plugin: ^6.0.0
  
  # Testes
  test:
    vitest: ^1.5.0
    cypress: ^13.0.0
    @testing-library/react: ^14.0.0
  
  # Design System (para microfrontends)
  design-system:
    @stencil/core: ^4.0.0
    storybook: ^7.6.0

2. Uso nos microfrontends

// apps/spotify-mfe-listening/package.json
{
  "name": "spotify-mfe-listening",
  "dependencies": {
    "react": "catalog:core",
    "react-dom": "catalog:core",
    "axios": "catalog:core"
  },
  "devDependencies": {
    "typescript": "catalog:dev",
    "vite": "catalog:dev",
    "eslint": "catalog:lint",
    "vitest": "catalog:test"
  }
}
// apps/spotify-mfe-discovery/package.json
{
  "name": "spotify-mfe-discovery",
  "dependencies": {
    "vue": "catalog:core",
    "axios": "catalog:core"
  },
  "devDependencies": {
    "typescript": "catalog:dev",
    "eslint": "catalog:lint",
    "vitest": "catalog:test"
  }
}

Melhorando a developer experience

PNPM Catalog Lens (extensão do VSCode)

Para melhorar a DX, instale a extensão PNPM Catalog Lens no VSCode. Ela mostra, direto no package.json, a versão real resolvida de cada pacote que está vindo do catálogo.

Benefícios:

  • ✅ Visibilidade clara das versões resolvidas
  • ✅ Debugging facilitado de conflitos
  • ✅ IntelliSense melhorado para catalogs

Comandos úteis

# Instalar dependências com catalogs
pnpm install

# Verificar versões resolvidas
pnpm list

# Atualizar catalogs
pnpm update --recursive

# Verificar dependências desatualizadas
pnpm outdated --recursive

Cenários de uso

Microfrontends

  • ✅ Consistência visual com design system
  • ✅ Versões sincronizadas entre MFEs
  • ✅ Upgrades coordenados sem quebrar integração

Monorepos

  • ✅ Dependências compartilhadas entre packages
  • ✅ Versionamento centralizado
  • ✅ Builds mais rápidos com cache otimizado

Multi-repos

  • ✅ Padrões consistentes entre projetos
  • ✅ Onboarding facilitado para novos desenvolvedores
  • ✅ Manutenção simplificada de dependências

Exemplo completo

Estrutura de projeto

project/
├── pnpm-workspace.yaml
├── apps/
│   ├── spotify-mfe-shell/
│   ├── spotify-mfe-listening/
│   └── spotify-mfe-discovery/
├── packages/
│   ├── design-system/
│   └── shared-utils/
└── microfrontends/
    ├── spotify-mfe-library/
    └── spotify-mfe-search/

Configuração do workspace

# pnpm-workspace.yaml
packages:
  - 'apps/*'
  - 'packages/*'
  - 'microfrontends/*'

catalogs:
  core:
    react: ^18.2.0
    vue: ^3.4.0
    axios: ^1.6.0
  
  design-system:
    @stencil/core: ^4.0.0
    storybook: ^7.6.0
  
  dev:
    typescript: ^5.3.0
    vite: ^5.0.0
    eslint: ^8.57.0
    prettier: ^3.2.5

Benefícios em produção

Para times

  • ✅ Menos conflitos de dependências
  • ✅ Onboarding mais rápido de novos desenvolvedores
  • ✅ Manutenção simplificada de projetos

Para arquitetura

  • ✅ Upgrades coordenados e seguros
  • ✅ Auditorias centralizadas de segurança
  • ✅ Governança melhorada de dependências

Para produto

  • ✅ Consistência entre microfrontends
  • ✅ Performance otimizada com cache compartilhado
  • ✅ Deploy mais confiável com versões testadas

Documentação oficial

PNPM Catalogs: https://pnpm.io/catalogs

Este artigo apresenta uma estratégia prática para gestão de dependências em projetos complexos. Para discussões técnicas, implementações ou dúvidas sobre PNPM Catalogs, me encontre no LinkedIn ou GitHub.

esc
  • Home Início
  • Sobre Trajetória e como trabalho
  • Blog Artigos sobre IA, plataforma e liderança
  • Projetos Demos públicos de frontend com IA
  • Currículo Web, PDF, Markdown e texto
  • Setup Hardware e ferramentas
  • Inference hooks do Claude: se o seu servidor de política cair, quem decide é um checkbox Arquitetura
  • Claude Code vazava o e-mail no User-Agent: o que eu checaria amanhã Segurança
  • Sete fases e onze testes: como a tela do agente aguenta queda, pausa e falta de rede Arquitetura
  • RAG no navegador custa 23 MB de download: como eu decidiria entre WebGPU e backend Arquitetura
↑↓ navegar ↵ abrir esc fechar