12k
All articles

Quando Você Não Precisa de uma Biblioteca de Componentes

Por que CSS utilitário e headless primitives costumam vencer component libraries em 2026, com checklist para decidir quando usar.

OpenReplay Team
OpenReplay Team
Quando Você Não Precisa de uma Biblioteca de Componentes

Para a maioria dos projetos pequenos, altamente personalizados ou com requisitos críticos de performance em 2026, você não precisa de uma biblioteca de componentes — você precisa de CSS utilitário para layout e primitivos headless para os três ou quatro comportamentos interativos genuinamente difíceis. Uma biblioteca estilizada completa como MUI, Ant Design ou Chakra só justifica seu peso sob condições específicas: consistência entre muitas equipes, ferramentas internas onde a velocidade de entrega supera a identidade visual, ou ausência de um recurso dedicado de design. Fora desses cenários, os custos de bundle, personalização e aparência genérica geralmente superam os benefícios. Este artigo oferece um framework de decisão — os custos reais de adotar uma biblioteca por padrão, os casos em que você genuinamente não precisa de uma, os casos em que precisa, e uma escada concreta de “nada” até “biblioteca completa” para que você escolha o degrau mais baixo que resolve o seu problema real.

O reframing essencial logo de início: “não use uma biblioteca de componentes” nunca significou “construa seus próprios dropdowns do zero.” Significa CSS utilitário mais primitivos headless testados em batalha para os comportamentos que são difíceis de acertar.

Principais Conclusões

  • O padrão moderno para a maioria dos projetos é CSS utilitário para estilização mais primitivos headless — não uma biblioteca de componentes estilizados completa e nem widgets interativos construídos manualmente.
  • Recorra a uma biblioteca estilizada completa apenas quando precisar de consistência entre muitas equipes, estiver entregando ferramentas internas onde velocidade supera identidade visual, ou não tiver um recurso dedicado de design.
  • O Reach UI não está mais sendo mantido, portanto qualquer recomendação de 2026 para usá-lo está equivocada — o papel de primitivo acessível agora pertence ao Radix Primitives e ao React Aria da Adobe.
  • A parte mais custosa de um dropdown construído manualmente não é a marcação; são a navegação por teclado, o aprisionamento de foco, o fechamento ao clicar fora e os anúncios para leitores de tela que um primitivo headless fornece por padrão.
  • O Tailwind CSS v4.0 é uma versão principal do framework CSS utilitário, publicada em 22 de janeiro de 2025, o que torna o CSS utilitário um padrão realista para a camada de estilização.

Os custos reais de adotar uma biblioteca de componentes por padrão

Uma biblioteca de componentes completa carrega três custos que se acumulam ao longo da vida de um projeto: peso do bundle, fricção de personalização e uniformidade visual. Nenhum deles é um impedimento isoladamente, mas juntos explicam por que importar o MUI para um site de marketing ou um aplicativo de cinco telas é geralmente um mau negócio.

Peso do bundle. Uma biblioteca estilizada monolítica entrega uma base de CSS e JavaScript — runtime de tematização, registro de componentes, design tokens — que chega independentemente de você renderizar três ou trinta componentes. O tree-shaking ajuda, mas apenas onde a biblioteca é genuinamente modular. Pacotes por componente fazem tree-shaking bem; o pacote radix-ui suporta tree-shaking, então você só entrega os componentes que usa. Payloads monolíticos de tema e estilização não perdem peso da mesma forma, porque o runtime é uma dependência compartilhada que cada componente importa. A versão honesta da afirmação “tree-shaking resolve isso”: funciona para primitivos modulares, não para uma biblioteca cujo motor de estilização é um único runtime.

Fricção de personalização. Se o design de um projeto é genérico e de vida curta, uma biblioteca pronta vence de forma direta. Se o design é distintivo e de longa duração, cada componente estilizado que você importa se torna uma batalha de especificidade que você travará pela vida do projeto — sobrescrevendo seletores aninhados, lutando contra os padrões do tema e encapsulando componentes para adaptá-los à sua identidade visual.

Aparência genérica. Os padrões de uma biblioteca são neutros por design. Uma identidade visual distintiva exige sobrescritas pesadas, o que nos leva de volta ao custo de personalização. Quanto mais distante seu design estiver das opiniões da biblioteca, mais você acabará lutando contra ela em vez de utilizá-la.

Quando você não precisa de uma biblioteca de componentes

Você não precisa de uma biblioteca de componentes quando a interface é majoritariamente estática, o design é distintivo ou a performance é uma restrição rígida. Esses são os projetos onde uma biblioteca é puro overhead.

  • Landing pages, blogs e portfólios. Majoritariamente tipografia, layout e alguns elementos interativos. O CSS utilitário cobre a estilização; raramente você precisará de mais do que alguns componentes interativos.
  • Aplicações altamente personalizadas. Quando o design é a identidade do produto, os padrões de uma biblioteca trabalham contra você. Construir a partir de classes utilitárias e um pequeno conjunto de componentes próprios oferece controle total sem precisar lutar contra as opiniões de outra pessoa.
  • Aplicações com requisitos críticos de performance. Quando cada kilobyte e cada milissegundo de latência de interação importam, entregar um runtime de biblioteca estilizada para alguns botões é o padrão errado.
  • Times que usam Tailwind. Se sua equipe já estiliza com classes utilitárias, uma biblioteca estilizada duplica a camada de estilização e cria duas fontes concorrentes de verdade sobre como as coisas devem parecer.

Uma distinção útil aqui: uma biblioteca de componentes é uma coleção de elementos de UI prontos; um design system é o framework mais amplo de princípios, tokens e regras de uso ao redor deles. Você pode precisar do segundo sem adquirir o primeiro — um conjunto de design tokens em propriedades customizadas CSS mais classes utilitárias oferece consistência sem importar os componentes de ninguém.

Quando você precisa de uma

Recorra a uma biblioteca estilizada completa quando velocidade e consistência em escala importam mais do que a distintividade da marca ou o tamanho do bundle. Quatro situações justificam isso:

  • Ferramentas internas e painéis administrativos. Ninguém avalia um painel CRUD de back-office pela identidade visual. Uma biblioteca que oferece tabelas, formulários, modais e seletores de data prontos é o caminho mais rápido para a entrega.
  • MVPs e protótipos. Quando o objetivo é validar uma ideia antes de investir em design, componentes prontos permitem que você avance rapidamente e descarte com facilidade.
  • Consistência empresarial entre múltiplas equipes. Quando muitas equipes entregam para um único produto, uma biblioteca compartilhada impõe uma aparência única e um único caminho de atualização — corrija um componente uma vez e todos os consumidores herdam a mudança.
  • Sem recurso dedicado de design. Se não há designer e nem design system, os padrões sensatos de uma biblioteca são melhores do que o que a maioria das equipes produzirá de forma improvisada.

O fio condutor: em cada caso, os padrões opinativos da biblioteca são uma vantagem, não uma restrição com a qual você vai lutar.

A escada de decisão: de nada a uma biblioteca de componentes completa

Em vez de um binário “biblioteca ou sem biblioteca,” pense em degraus. Cada degrau adiciona capacidade e custo; suba apenas até onde suas necessidades reais exigem. Isso moderniza o espectro clássico de build-vs-buy.

DegrauO que você utilizaUse quando
1. Nada extraHTML + CSS puro, pequenos componentes reutilizáveisUI estática ou quase estática, controle total de design
2. CSS utilitárioTailwind CSS v4 + design tokensVocê quer velocidade na estilização sem abandonar o CSS
3. Primitivos headlessRadix, React Aria, Headless UI, Ark UIVocê precisa de dropdowns, diálogos e comboboxes acessíveis
4. Componentes de propósito únicoreact-select, um seletor de data, um editor de rich-textUm widget genuinamente difícil, não um kit de UI completo
5. Biblioteca estilizada completaMUI, Ant Design, Chakra UIFerramentas internas, consistência empresarial, sem designer

Degrau 2 — CSS utilitário. O Tailwind é o padrão realista para a camada de estilização e layout. O Tailwind CSS v4.0 é uma versão completamente nova do framework, otimizada para performance e flexibilidade, com uma experiência de configuração e personalização reimaginada. A principal mudança arquitetural: o Tailwind CSS v4 é uma ferramenta completa para processar seu CSS, com o Lightning CSS integrado diretamente ao framework para que você não precise configurar nada sobre seu pipeline de CSS. A configuração migrou do tailwind.config.js para o CSS via a diretiva @theme. As versões patch evoluem rapidamente, então fixe uma versão no seu projeto em vez de memorizar uma; a v4 é a atual em junho de 2026.

Degrau 3 — primitivos headless. Este é o degrau que os conselhos mais antigos de “não use uma biblioteca” subestimam, e é o mais importante. Os primitivos headless oferecem o comportamento acessível de um componente interativo — tratamento de teclado, gerenciamento de foco, configuração de ARIA — sem nenhuma estilização, para que você traga suas próprias classes utilitárias.

O Radix Primitives é a escolha de referência: uma biblioteca de componentes de UI de baixo nível com foco em acessibilidade, personalização e experiência do desenvolvedor, uma biblioteca de componentes de UI open-source para construir design systems e aplicações web de alta qualidade e acessíveis, mantida pela WorkOS. Oferece primitivos para padrões comuns de UI como diálogos, dropdowns, popovers e tooltips, todos construídos com conformidade WAI-ARIA para garantir suporte a leitores de tela e navegação por teclado. Para equipes com múltiplos frameworks, o Ark UI (construído sobre as máquinas de estado do Zag.js, com paridade para React/Vue/Solid/Svelte) cobre o mesmo terreno entre frameworks. Se você está no React, o React Aria da Adobe e o Headless UI da Tailwind Labs (que suporta React e Vue) são opções equivalentes.

Uma correção que vale mencionar explicitamente: evite o Reach UI em 2026. O Reach UI não está mais sendo mantido, conforme seu repositório oficial no GitHub. O mantenedor declarou “falência de OSS” em 2022, e desde que o Reach foi introduzido, outros construíram componentes de baixo nível, compostos e acessíveis, com várias bibliotecas bem mantidas para considerar — Radix e React Aria entre as principais. Qualquer artigo que ainda recomende o Reach UI para “os casos difíceis” está apontando para uma dependência abandonada.

Degrau 4 — componentes de propósito único. Quando um widget é genuinamente difícil — um multi-select pesquisável, um seletor de intervalo de datas, um editor de rich-text — importe um pacote dedicado e testado em batalha para aquele único elemento, em vez de adotar um kit de UI completo para obtê-lo.

Vale também notar que a plataforma absorveu problemas que antes exigiam uma biblioteca. No React 19, o suporte ao uso de funções assíncronas em transições lida automaticamente com estados pendentes, erros, formulários e atualizações otimistas, e as novas ações de formulário mais as APIs useActionState, useFormStatus, useOptimistic e use() reduzem o argumento de “você precisa de uma biblioteca de formulários para isso” para uma classe de formulários. Ter menos razões para subir na escada é uma vantagem.

O custo oculto de construir componentes interativos manualmente

A razão pela qual “não use uma biblioteca” não deve colapsar em “construa tudo você mesmo” é acessibilidade e comportamento em casos extremos. A parte mais custosa de um dropdown construído manualmente não é a marcação — são a navegação por teclado, o aprisionamento de foco, o fechamento ao clicar fora e os anúncios para leitores de tela que um primitivo headless oferece gratuitamente.

Esta é precisamente a lacuna que os autores do Radix descrevem: as implementações que a plataforma web fornece para esses padrões são inadequadas — inexistentes, com funcionalidade limitada ou sem personalização suficiente — então os desenvolvedores são forçados a construir componentes customizados, uma tarefa incrivelmente difícil, e como resultado a maioria dos componentes na web é inacessível, tem baixa performance e carece de funcionalidades importantes.

Falhas de acessibilidade em componentes interativos construídos manualmente são a classe de bug que o session replay revela em produção. Assistir replays de controles construídos de forma customizada é onde o verdadeiro custo de “apenas construa você mesmo” se torna visível: um usuário de teclado cujo foco escapa de um modal customizado e cai na página por trás dele; um usuário mobile tocando repetidamente em um dropdown que não fecha porque não há tratamento de clique externo ou da tecla Escape; um combobox que nunca anuncia suas opções para um leitor de tela, fazendo o usuário desistir. Esses são exatamente os comportamentos que um primitivo headless trata por padrão — e exatamente os comportamentos que um componente construído manualmente silenciosamente erra até que alguém assista um usuário real lutando com ele.

A conclusão não é “sempre use um primitivo.” É que o custo de componentes interativos DIY é pago depois, em bugs de acessibilidade e interações abandonadas, não antecipadamente na marcação. Considere isso antes de decidir construir manualmente.

Uma lista de verificação para a decisão

Passe um projeto por estas cinco perguntas antes de escolher um degrau:

  1. Tempo de vida. Protótipo descartável ou produto de múltiplos anos? Curta duração favorece soluções prontas; longa duração favorece ter sua própria camada de estilização.
  2. Distintividade da marca. Genérico e baseado em templates, ou uma identidade distintiva? Um design distintivo torna uma biblioteca estilizada um passivo.
  3. Tamanho da equipe. Uma equipe ou várias entregando para um único produto? Consistência entre múltiplas equipes é o argumento mais forte para uma biblioteca compartilhada.
  4. Orçamento de performance. O tamanho do bundle ou a latência de interação são restrições rígidas? Se sim, prefira CSS utilitário mais primitivos por componente em vez de um runtime monolítico.
  5. Quem mantém. Você tem um designer e capacidade para manter uma camada customizada? A ausência de um recurso de design empurra você em direção aos padrões sensatos de uma biblioteca.

Se a maioria das respostas aponta para “curta duração, genérico, múltiplas equipes, sem designer,” suba para o degrau 5. Se apontam para “longa duração, distintivo, uma equipe, orçamento de performance restrito,” fique nos degraus 2 e 3.

Conclusão

O padrão para novos projetos frontend em 2026 é CSS utilitário para estilização e primitivos headless para o punhado de interações que são difíceis de acertar — subindo para uma biblioteca estilizada completa apenas quando consistência em escala, velocidade pura de entrega ou a ausência de um recurso de design tornam seus padrões opinativos uma vantagem. Antes de executar npm install em um kit de UI por hábito, percorra a lista de verificação de cinco perguntas e escolha o degrau mais baixo que resolve o problema à sua frente. Construa com intenção, não por reflexo — e deixe o projeto, não o instinto, decidir quanta biblioteca você realmente precisa.

Perguntas Frequentes

Qual é a diferença entre uma biblioteca de componentes headless e uma biblioteca de componentes estilizados?

Uma biblioteca headless como Radix Primitives, React Aria ou Headless UI fornece o comportamento e a acessibilidade de um componente interativo — navegação por teclado, gerenciamento de foco, configuração de ARIA — sem nenhuma estilização, para que você forneça seu próprio CSS ou classes utilitárias. Uma biblioteca estilizada como MUI, Ant Design ou Chakra UI entrega tanto o comportamento quanto um design visual opinativo mais um runtime de tematização. A abordagem headless troca conveniência por controle visual total e uma pegada de estilização menor.

É possível usar Tailwind CSS e uma biblioteca de componentes juntos no mesmo projeto?

Sim, mas geralmente duplica a camada de estilização e cria duas fontes concorrentes de verdade sobre como as coisas devem parecer. Uma biblioteca estilizada entrega seu próprio runtime de tematização, então combiná-la com Tailwind significa manter ambos. A combinação mais limpa é Tailwind para estilização mais um primitivo headless como Radix, React Aria ou Ark UI, que não entrega estilos próprios e é projetado para ser estilizado com classes utilitárias.

Por que o Reach UI não é mais recomendado para componentes React acessíveis?

O Reach UI não está mais sendo mantido, conforme seu repositório oficial no GitHub. O mantenedor declarou falência de OSS em 2022, e o projeto não recebeu desenvolvimento ativo desde então. Qualquer orientação de 2026 recomendando o Reach UI para dropdowns, tooltips ou outros padrões interativos difíceis está apontando para uma dependência abandonada. O papel de primitivo acessível que ele ocupava agora pertence ao Radix Primitives e ao React Aria da Adobe, ambos ativamente mantidos com suporte completo de teclado e foco WAI-ARIA.

Qual biblioteca de componentes headless funciona entre React, Vue, Solid e Svelte?

O Ark UI é a opção agnóstica de framework, construído sobre as máquinas de estado do Zag.js com paridade entre React, Solid, Vue e Svelte. A maioria dos primitivos headless é específica de framework: Radix Primitives e React Aria da Adobe têm como alvo o React, enquanto o Headless UI da Tailwind Labs suporta React e Vue. Se você precisa de lógica de componente compartilhada entre múltiplos frameworks em uma organização, o Ark UI é projetado para esse caso, já que o comportamento subjacente reside no Zag.js em vez de em um único binding de framework.

Digital experience platform

Truly understand users experience

See every user interaction, feel every frustration and track all hesitations with OpenReplay — the open-source digital experience platform. It can be self-hosted in minutes, giving you complete control over your customer data.

Star on GitHub12k

We use cookies to improve your experience. By using our site, you accept cookies.