Reflection about componentization in Nuxt 3

Sinceramente, me vejo no dever de compartilhar o quanto o Nuxt 3, nesses últimos meses, me ensinou na prática que componentização não é sobre reaproveitar código, mas sobre clareza, manutenção e escala.

O início: tudo em um único componente

Lembro que, no começo, tudo em um único componente era simplesmente incrível — funcionava!
Mas bastaram algumas semanas e novas features para eu realmente perceber o quanto aquilo deveria ter sido pensado de outra forma.

O colapso da abstração infinita

Foi aí que eu entrei num complexo de abstração simplesmente INFINITA.
Tudo deveria ser abstraído... mas quanto mais abstraído, mais manipulações de componentes eu queria.
E no fim? Eu criava um outro componente só para atender minhas expectativas.

O dilema da abstração

Estive debatendo esse tópico com alguns colegas e a principal pergunta foi:

"Mas por que essa crise de abstração é tão comum?"

E a resposta é simples:

  • Abstrair demais e criar componentes pequenos e específicos pode gerar mais confusão do que clareza.
  • E abstrair de menos e deixar tudo em um componente mágico, cheio de props, torna a manutenção mega dolorosa.
    E o código? Um verdadeiro monolito .vue (rs).

Padrões no caos

Hoje, com mais experiência, consigo enxergar padrões no caos e tomar decisões muito mais conscientes:

"Isso aqui merece mesmo um componente?"
"Vale mesmo extrair essa lógica?"
"Como é a periodicidade, repetição e variações do mesmo componente no Figma?"

Exemplo prático

Excesso de componentização: Megazord.vue (com mil props)

<template>
  <MegazordComponent
    :title="title"
    :image="image"
    :description="description"
    :cta-text="ctaText"
    :show-rating="showRating"
    :border="border"
    :icon="icon"
    :shadow="shadow"
  />
</template>

Abordagem alternativa e mais clara

<template>
  <div class="card">
    <img :src="product.image" />
    <h3>{{ product.title }}</h3>
    <p>{{ product.description }}</p>
    <button>Ver mais</button>
  </div>
</template>

<script setup>
defineProps({ product: Object })
</script>
Voltar para listagem