May 13, 2025

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.

PNPM Catalogs: Catálogo Central de Versões Recomendadas para Microfrontends

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 (VSCode Extension)

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 Ideais

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.