Capa do Ebook gratuito Arquitetura de CSS Escalável: BEM, ITCSS e Design Tokens para Projetos Reais

Arquitetura de CSS Escalável: BEM, ITCSS e Design Tokens para Projetos Reais

Novo curso

22 páginas

Mini-guia de migração para arquitetura escalável: inventário, priorização e plano por etapas

Capítulo 20

Tempo estimado de leitura: 12 minutos

+ Exercício

O que este mini-guia resolve (e o que ele não tenta fazer)

Migrar um CSS existente para uma arquitetura escalável raramente é um “projeto de reescrita”. Na prática, você precisa continuar entregando funcionalidades enquanto reduz risco, elimina duplicações e cria um caminho claro para que o time passe a trabalhar de forma consistente. Este mini-guia foca em três frentes operacionais: (1) inventariar o que existe, (2) priorizar o que migrar primeiro e (3) executar um plano por etapas com critérios objetivos de “pronto”.

O objetivo aqui não é reexplicar as técnicas (camadas, convenções, tokens, etc.), mas mostrar como conduzir a migração no mundo real: como levantar dados, como decidir onde começar, como evitar regressões e como medir progresso sem paralisar o produto.

Pré-requisitos práticos antes de começar

Defina o “alvo” da migração em termos verificáveis

Antes de inventariar, descreva o que significa “migrado” para o seu contexto. Exemplos de critérios verificáveis:

  • Novas features não adicionam CSS fora do novo padrão (ex.: só entram via novos arquivos/pastas e convenções definidas).
  • Componentes migrados não dependem de seletores globais frágeis (ex.: não dependem de “.sidebar a span” para funcionar).
  • Tokens/variáveis são usados para valores de cor, espaçamento e tipografia em componentes migrados.
  • Há um mecanismo de convivência entre legado e novo (feature flags, escopo por página, ou ordem de carregamento controlada).

Crie um “modo de convivência” entre legado e novo

Na migração incremental, você terá dois mundos por um tempo. Planeje isso explicitamente para reduzir conflitos:

  • Estratégia por rotas/páginas: páginas novas usam o novo CSS; páginas antigas permanecem no legado até serem tocadas.
  • Estratégia por componentes: componentes migrados passam a ser usados em qualquer página, mas com escopo e dependências bem definidas.
  • Estratégia por “shell”: um layout base (header/footer/grid) migra primeiro e o conteúdo interno migra depois.

Escolha uma estratégia principal e documente. Misturar as três sem critério costuma aumentar regressões.

Continue em nosso aplicativo

Você poderá ouvir o audiobook com a tela desligada, ganhar gratuitamente o certificado deste curso e ainda ter acesso a outros 5.000 cursos online gratuitos.

ou continue lendo abaixo...
Download App

Baixar o aplicativo

Inventário: como mapear o CSS e a UI sem se perder

1) Levantamento de fontes de verdade

Liste tudo que gera estilo no produto. O inventário falha quando você só olha para “styles.css” e ignora fontes indiretas. Inclua:

  • Arquivos CSS/SCSS/LESS e seus pontos de entrada (bundles).
  • CSS em componentes (CSS Modules, styled-components, etc.), se existirem.
  • CSS inline em templates, e-mails, CMS, ou páginas “especiais”.
  • Dependências externas (bibliotecas de UI, plugins com CSS próprio).
  • Temas/skins (arquivos por cliente, marca, white-label).

2) Inventário orientado a “superfícies” (telas/fluxos)

Em vez de começar pelos arquivos, comece pelas superfícies que o usuário vê. Monte uma lista de telas e fluxos críticos (ex.: login, checkout, dashboard, cadastro). Para cada superfície, registre:

  • URL/rota e variações (mobile/desktop, tema A/B, estado logado/deslogado).
  • Componentes visíveis (botões, cards, tabelas, formulários, navegação).
  • Estados importantes (erro, loading, vazio, desabilitado, sucesso).
  • Risco de regressão (financeiro, legal, conversão, suporte).

Esse inventário vira a base para priorização e também para testes de regressão (mesmo que manuais no início).

3) Inventário orientado a “componentes reais” (não só nomes)

É comum o mesmo componente existir em 3 versões com nomes diferentes. Para evitar isso, inventarie por evidência visual e comportamento:

  • Capture screenshots (ou referências) de cada variação.
  • Registre props/variações: tamanho, densidade, ícone, alinhamento, tema.
  • Registre dependências: precisa de wrapper específico? depende de grid? depende de reset local?

Uma forma simples de organizar é uma planilha com colunas: “Componente (conceito)”, “Implementações existentes”, “Onde aparece”, “Variações”, “Problemas conhecidos”, “Prioridade”.

4) Inventário de “hotspots” no CSS

Além do inventário visual, identifique hotspots técnicos que costumam causar retrabalho:

  • Arquivos muito grandes e editados por muita gente.
  • Seletores repetidos com pequenas diferenças.
  • Regras com muitos overrides (sinais de briga de cascata).
  • Uso excessivo de !important (não como julgamento, mas como indicador de fragilidade).
  • Estilos globais que vazam para áreas inesperadas.

Você não precisa resolver tudo agora; precisa apenas localizar onde a migração terá maior impacto.

5) Classifique o inventário em categorias de migração

Para transformar inventário em plano, categorize itens. Um modelo prático:

  • Fundação: tokens, base visual, helpers de layout, infraestrutura de build/lint (se aplicável).
  • Estruturais: header, sidebar, footer, grid principal, containers.
  • Componentes transversais: botões, inputs, modais, alerts, tabs (aparecem em muitos lugares).
  • Componentes locais: widgets específicos de uma tela.
  • Legado congelado: áreas que não valem o custo agora (baixo tráfego, descontinuação próxima).

Essa classificação ajuda a evitar migrar “o que é fácil” e deixar o que mais dói para depois sem perceber.

Priorização: como decidir por onde começar (com critérios objetivos)

Modelo de pontuação simples (Impacto x Esforço x Risco)

Crie uma pontuação para cada item (tela, componente ou módulo). Exemplo de escala 1–5:

  • Impacto: quantas telas usam? quanto afeta conversão/suporte?
  • Esforço: quantas variações? quão acoplado ao legado?
  • Risco: probabilidade de regressão e custo de erro.

Uma fórmula simples para ordenar: (Impacto * 2) - Esforço - Risco. Ajuste pesos conforme seu contexto. O importante é tornar a decisão discutível com dados, não com “achismo”.

Priorize “multiplicadores” (o que destrava o resto)

Alguns itens aceleram a migração porque reduzem custo futuro:

  • Componentes transversais (ex.: botão, input, modal) reduzem duplicação em várias features.
  • Layout base (containers, grids, espaçamentos padrão) diminui CSS por tela.
  • Tokens aplicados em áreas novas evitam variações de cor/spacing surgindo de novo.

Se você migrar primeiro componentes muito locais, pode ter sensação de progresso, mas pouco ganho sistêmico.

Priorize também “zonas de dor” com alto custo recorrente

Às vezes o item não é o mais usado, mas é o que mais consome tempo do time:

  • Uma tela que quebra frequentemente em responsivo.
  • Um módulo com muitas exceções por cliente/tema.
  • Um conjunto de estilos que sempre exige overrides para cada nova feature.

Inclua no inventário uma coluna “Horas gastas nos últimos X meses” (mesmo estimada). Isso muda a priorização de forma saudável.

Defina “não metas” (o que não será migrado agora)

Para evitar escopo infinito, declare explicitamente itens fora do ciclo atual:

  • Páginas com baixa relevância e sem roadmap.
  • Experimentos temporários.
  • Áreas prestes a serem substituídas.

Isso reduz ansiedade do time e evita que a migração vire um buraco negro.

Plano por etapas: roteiro incremental com entregas pequenas e seguras

Etapa 0 — Preparar o terreno (sem refatorar UI ainda)

Objetivo: permitir que o novo CSS exista sem brigar com o legado.

  • Defina pontos de entrada: qual bundle carrega o novo CSS? em quais páginas?
  • Defina regras de contribuição: “toda alteração em componente X deve ser feita no novo padrão” (quando aplicável).
  • Crie um diretório de migração: por exemplo, styles/new/ separado do legado.
  • Crie um mecanismo de escopo: um wrapper de aplicação (ex.: .app) para limitar vazamento, se necessário.

Exemplo de escopo por wrapper para reduzir colisões durante convivência:

.app .c-button { /* novo componente */ }

Esse tipo de escopo é uma muleta temporária: útil para migração, mas deve ser planejado para não virar dependência eterna.

Etapa 1 — Escolher um “piloto” representativo

Objetivo: validar o processo em algo real, mas controlado.

Critérios para escolher o piloto:

  • Não ser a área mais crítica do negócio.
  • Ter componentes reutilizáveis (para gerar ganho).
  • Ter variações suficientes para testar o modelo (estados, responsivo).

Entregáveis do piloto:

  • Lista de componentes migrados.
  • Checklist de regressão executado.
  • Decisões registradas: o que funcionou, o que gerou atrito, ajustes no fluxo.

Etapa 2 — Migrar por “fatias verticais” (feature slice), não por arquivos

Objetivo: cada etapa entrega valor e reduz legado em uma área utilizável.

Uma fatia vertical típica inclui:

  • Uma rota/tela (ou parte dela).
  • Os componentes necessários para essa tela.
  • Os estados (erro/loading/vazio) relevantes.
  • Testes visuais básicos (mesmo que manuais) e critérios de aceite.

Evite migrar “todas as classes de utilitários” ou “todo o arquivo forms.scss” sem amarrar a uma entrega. Migração por arquivo tende a gerar trabalho invisível e regressões tardias.

Etapa 3 — Estratégias de substituição: “lado a lado” vs “troca direta”

Há duas formas comuns de trocar um componente legado por um novo.

Lado a lado (recomendado quando há alto risco)

Você cria o novo componente com nomes novos e passa a usá-lo em uma área controlada. O legado continua existindo até a adoção completa.

  • Prós: baixo risco, fácil rollback.
  • Contras: duplicação temporária, CSS total pode aumentar antes de diminuir.

Exemplo: manter .btn legado e introduzir .c-button novo, migrando tela por tela.

Troca direta (quando o legado é centralizado e bem localizado)

Você substitui a implementação mantendo a API (classes/markup) ou fazendo uma troca coordenada.

  • Prós: reduz duplicação rapidamente.
  • Contras: maior risco de regressão ampla.

Use troca direta quando você tem boa cobertura de telas afetadas e consegue testar rapidamente.

Etapa 4 — Controle de regressão: checklist por entrega

Para cada fatia migrada, execute um checklist curto e repetível. Exemplo:

  • Verificar estados: hover/focus/disabled/loading/erro (quando aplicável).
  • Verificar responsivo em 2–3 larguras representativas.
  • Verificar temas (se houver) e contraste mínimo em textos/ações.
  • Verificar integração: componente dentro de containers diferentes (ex.: dentro de card, dentro de modal).
  • Verificar que não houve impacto visual em telas fora do escopo (amostragem).

Se o time tiver condições, adicione snapshots visuais automatizados para as rotas do inventário. Se não tiver, mantenha um roteiro manual consistente e rápido.

Etapa 5 — Remoção segura: como realmente reduzir o legado

Um erro comum é “migrar” e nunca remover o CSS antigo, acumulando peso. Planeje a remoção como parte do trabalho, com critérios:

  • Critério de remoção por componente: “nenhuma rota do inventário usa mais o componente legado”.
  • Busca por uso: procurar classes no código e em templates gerados (quando possível).
  • Janela de observação: manter por um ciclo de release se houver incerteza.
  • Remoção em pequenos PRs: facilita revisão e rollback.

Uma prática útil é manter uma lista de “CSS candidato a remoção” com links para PRs e evidências (rotas migradas, buscas, screenshots).

Como transformar inventário em backlog executável

Formato de ticket para migração (modelo)

Padronize tickets para reduzir ambiguidade. Um modelo enxuto:

  • Escopo: tela/rota + componentes incluídos.
  • Fora de escopo: itens explicitamente excluídos.
  • Critérios de aceite: checklist de regressão + critérios de “migrado”.
  • Dependências: precisa de token X? precisa de componente Y primeiro?
  • Plano de rollback: como desfazer se der problema (flag, revert, fallback).

Defina “Definition of Done” específico para migração

Além do “funciona”, inclua itens que evitam voltar ao caos:

  • Sem novos estilos adicionados no legado para resolver a feature migrada.
  • Documentação mínima: onde o componente vive, como usar, variações.
  • Remoção ou depreciação do CSS antigo quando aplicável.
  • Registro de decisões: por que escolheu lado a lado ou troca direta.

Armadilhas comuns e como evitá-las durante a migração

Migrar “por estética” e não por comportamento

Se você migra só a aparência, mas mantém dependências ocultas (markup frágil, wrappers obrigatórios, hacks), o custo volta. No inventário, registre dependências de estrutura e estados; no plano, trate isso como parte do trabalho.

Subestimar variações reais do produto

O componente “botão” pode ter 12 variações no produto real (ícone, loading, tamanhos, contexto em toolbar, contexto em formulário). O inventário por superfícies ajuda a capturar essas variações antes de refatorar.

Não reservar tempo para remoção

Sem remoção, a migração vira “duplicação permanente”. Inclua tarefas de limpeza no mesmo ciclo, nem que seja uma remoção parcial com evidência.

Falta de governança leve

Durante a migração, o time precisa de um mecanismo simples para decidir: “isso entra no novo padrão ou fica no legado?”. Uma regra prática:

  • Se a alteração é em um componente já migrado, só mexa no novo.
  • Se é uma feature nova em uma área ainda legada, avalie: dá para criar componentes novos reutilizáveis sem tocar no legado? Se sim, faça; se não, faça o mínimo no legado e registre no backlog de migração.

Exemplo de plano de 6 semanas (adaptável)

Semana 1: inventário e priorização

  • Mapear 10–20 rotas principais e seus componentes.
  • Listar 15–30 componentes transversais e suas variações.
  • Pontuar itens (impacto/esforço/risco) e escolher piloto.

Semana 2: piloto

  • Migrar 1 rota com 3–5 componentes reutilizáveis.
  • Definir checklist de regressão e ajustar fluxo de PR/review.
  • Decidir estratégia padrão (lado a lado ou troca direta) para o restante.

Semanas 3–4: multiplicadores

  • Migrar componentes transversais mais usados (ex.: modal, alert, tabela simples) conforme inventário.
  • Aplicar em 2–3 rotas adicionais (fatias verticais).
  • Começar remoção segura do legado onde houver evidência.

Semanas 5–6: expansão e limpeza

  • Migrar rotas de maior impacto com base no ranking.
  • Consolidar variações duplicadas encontradas no inventário.
  • Rodadas de remoção incremental e redução de bundles legados.

Esse exemplo funciona como estrutura: o conteúdo real do plano vem do seu inventário e da sua priorização. O ponto central é manter entregas pequenas, com critérios claros e remoção planejada.

Agora responda o exercício sobre o conteúdo:

Em uma migração incremental para uma arquitetura de CSS escalável, qual prática tende a reduzir risco e evitar trabalho invisível?

Você acertou! Parabéns, agora siga para a próxima página

Você errou! Tente novamente.

Migrar por fatias verticais entrega valor utilizável a cada etapa, inclui estados importantes e força um checklist de regressão e critérios de pronto, evitando refatorações por arquivo que geram progresso pouco visível e regressões tardias.

Próximo capitúlo

Documentação e manutenção em equipe: guidelines, exemplos de referência e acordos de linting

Arrow Right Icon
Baixe o app para ganhar Certificação grátis e ouvir os cursos em background, mesmo com a tela desligada.