<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Gabriel Caiana</title>
    <description>The latest articles on Forem by Gabriel Caiana (@gabrielcaiana).</description>
    <link>https://forem.com/gabrielcaiana</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F610845%2F7b4f9d8f-9de6-4da9-b24e-90a50698bbab.jpeg</url>
      <title>Forem: Gabriel Caiana</title>
      <link>https://forem.com/gabrielcaiana</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/gabrielcaiana"/>
    <language>en</language>
    <item>
      <title>Arquitetura Modular com Nuxt Layers em Projetos Vue</title>
      <dc:creator>Gabriel Caiana</dc:creator>
      <pubDate>Thu, 02 Oct 2025 07:57:40 +0000</pubDate>
      <link>https://forem.com/gabrielcaiana/arquitetura-modular-com-nuxt-layers-em-projetos-vue-586k</link>
      <guid>https://forem.com/gabrielcaiana/arquitetura-modular-com-nuxt-layers-em-projetos-vue-586k</guid>
      <description>&lt;h2&gt;
  
  
  O Desafio Invisível que Todo Dev Frontend Enfrenta
&lt;/h2&gt;

&lt;p&gt;Você conhece essa história: começou um projeto Vue pequeno, organizou tudo direitinho - &lt;code&gt;components&lt;/code&gt; aqui, &lt;code&gt;pages&lt;/code&gt; ali, &lt;code&gt;stores&lt;/code&gt; no seu lugar. Três meses depois, você tem 147 componentes, e encontrar aquele &lt;code&gt;ProductCardVariantB.vue&lt;/code&gt; virou uma expedição arqueológica.&lt;/p&gt;

&lt;p&gt;Pior ainda: você precisa mexer no carrinho de compras, mas os arquivos estão espalhados em 7 pastas diferentes. Um componente aqui, uma store ali, as páginas em outro lugar... e aquela sensação de que a organização que fazia sentido no início agora está atrapalhando seu trabalho.&lt;/p&gt;

&lt;p&gt;Este é o problema silencioso da escalabilidade em frontend. E a solução vem de um lugar inesperado: conceitos de arquitetura backend aplicados ao mundo do navegador.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Inspiração: Monólitos Modulares do Backend
&lt;/h2&gt;

&lt;p&gt;No mundo backend, existe um debate eterno: monólito ou microserviços? Mas arquitetos como &lt;a href="https://x.com/samnewman" rel="noopener noreferrer"&gt;Sam Newman&lt;/a&gt; e &lt;a href="https://x.com/simonbrown" rel="noopener noreferrer"&gt;Simon Brown&lt;/a&gt; propuseram uma terceira via: o &lt;a href="https://www.thoughtworks.com/insights/blog/microservices/modular-monolith-better-way-build-software" rel="noopener noreferrer"&gt;&lt;strong&gt;monólito modular&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Como Martin Fowler explica, um monólito modular é "uma aplicação única que mantém uma estrutura interna altamente modularizada". Você tem os benefícios de modularização (separação de responsabilidades, desenvolvimento independente, fronteiras claras) sem a complexidade operacional de microserviços (múltiplos deploys, comunicação via rede, orquestração).&lt;/p&gt;

&lt;h3&gt;
  
  
  O Princípio Fundamental
&lt;/h3&gt;

&lt;p&gt;A sacada genial é organizar o código por &lt;strong&gt;domínio de negócio&lt;/strong&gt; em vez de &lt;strong&gt;responsabilidade técnica&lt;/strong&gt;. No backend, isso significa que tudo relacionado a "Pagamentos" fica junto - controllers, services, repositories, models. Tudo sobre "Usuários" em outro módulo. E assim por diante.&lt;/p&gt;

&lt;p&gt;Mas... e no frontend?&lt;/p&gt;

&lt;h2&gt;
  
  
  O Problema da Organização Tradicional em Vue/Nuxt
&lt;/h2&gt;

&lt;p&gt;Vamos ser honestos sobre como 99% dos projetos Vue são organizados hoje:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;meu-ecommerce/
├── components/
│   ├── cart/
│   │   ├── CartItem.vue
│   │   ├── CartSummary.vue
│   │   └── CartDrawer.vue
│   ├── product/
│   │   ├── ProductCard.vue
│   │   ├── ProductGallery.vue
│   │   └── ProductReviews.vue
│   └── shared/
│       ├── Button.vue
│       └── Modal.vue
├── pages/
│   ├── products/
│   │   └── [id].vue
│   ├── cart.vue
│   └── index.vue
├── stores/
│   ├── cart.js
│   ├── product.js
│   └── user.js
└── composables/
    ├── useCart.js
    └── useProduct.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Parece organizado, certo? Mas vamos pensar em um cenário real:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Preciso implementar uma nova feature no carrinho"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Você vai precisar:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Navegar até &lt;code&gt;components/cart/&lt;/code&gt; para os componentes&lt;/li&gt;
&lt;li&gt;Pular para &lt;code&gt;pages/cart.vue&lt;/code&gt; para a página&lt;/li&gt;
&lt;li&gt;Ir em &lt;code&gt;stores/cart.js&lt;/code&gt; para a lógica de estado&lt;/li&gt;
&lt;li&gt;Verificar &lt;code&gt;composables/useCart.js&lt;/code&gt; para funções auxiliares&lt;/li&gt;
&lt;li&gt;Talvez até &lt;code&gt;api/cart.js&lt;/code&gt; se tiver separado&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;São &lt;strong&gt;5 diretórios diferentes&lt;/strong&gt; para trabalhar em uma única feature. Multiplique isso por cada desenvolvedor do time, cada feature, cada dia... e você entende por que projetos grandes se tornam difíceis de manter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Nuxt Layers: A Revolução Silenciosa
&lt;/h2&gt;

&lt;p&gt;Com o Nuxt 3, veio uma feature que passou meio despercebida mas que é revolucionária: &lt;strong&gt;Nuxt Layers&lt;/strong&gt;. Como &lt;a href="https://davestewart.co.uk/bio/" rel="noopener noreferrer"&gt;Dave Stewart&lt;/a&gt; explica em seu artigo sobre &lt;a href="https://davestewart.co.uk/blog/nuxt-layers/" rel="noopener noreferrer"&gt;arquitetura modular&lt;/a&gt;, Layers permitem reorganizar completamente a estrutura do projeto.&lt;/p&gt;

&lt;p&gt;Em vez de organizar por tipo de arquivo, organizamos por domínio:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;meu-ecommerce/
├── layers/
│   ├── cart/                    # Tudo sobre carrinho
│   │   ├── components/
│   │   │   ├── CartItem.vue
│   │   │   ├── CartSummary.vue
│   │   │   └── CartDrawer.vue
│   │   ├── pages/
│   │   │   └── cart.vue
│   │   ├── stores/
│   │   │   └── cart.js
│   │   ├── composables/
│   │   │   └── useCart.js
│   │   └── nuxt.config.ts       # Config específica do cart
│   │
│   ├── product/                 # Tudo sobre produtos
│   │   ├── components/
│   │   ├── pages/
│   │   ├── stores/
│   │   └── nuxt.config.ts
│   │
│   └── catalog/                 # Tudo sobre catálogo
│       ├── components/
│       ├── pages/
│       ├── stores/
│       └── nuxt.config.ts
└── nuxt.config.ts               # Config principal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Como Funciona na Prática
&lt;/h3&gt;

&lt;p&gt;Cada layer é como uma "mini-aplicação" Vue. Tem sua própria estrutura, suas próprias configurações, seus próprios módulos. O Nuxt então "costura" tudo junto em tempo de build.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// nuxt.config.ts principal&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineNuxtConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;extends&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./layers/cart&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./layers/product&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./layers/catalog&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E cada layer pode ter sua própria configuração:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// layers/cart/nuxt.config.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineNuxtConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="c1"&gt;// Módulos específicos do carrinho&lt;/span&gt;
  &lt;span class="na"&gt;modules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@vueuse/nuxt&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;

  &lt;span class="c1"&gt;// Components do carrinho&lt;/span&gt;
  &lt;span class="na"&gt;components&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;dirs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
      &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./components&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Cart&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;  &lt;span class="c1"&gt;// CartItem, CartSummary, etc.&lt;/span&gt;
    &lt;span class="p"&gt;}]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Os Benefícios Transformadores
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Coesão Natural de Domínio
&lt;/h3&gt;

&lt;p&gt;Quando você precisa trabalhar no carrinho, &lt;strong&gt;tudo está em &lt;code&gt;layers/cart&lt;/code&gt;&lt;/strong&gt;. Não precisa ficar pulando entre pastas. É como ter um mini-projeto dedicado só para aquela feature.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Trabalhando no carrinho? É só isso:&lt;/span&gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;layers/cart
&lt;span class="c"&gt;# Todos os arquivos relacionados estão aqui&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Desenvolvimento Verdadeiramente Paralelo
&lt;/h3&gt;

&lt;p&gt;Com domínios isolados, times diferentes podem trabalhar sem pisar no pé um do outro:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Time A&lt;/strong&gt; trabalhando em &lt;code&gt;layers/checkout&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time B&lt;/strong&gt; refatorando &lt;code&gt;layers/product&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Time C&lt;/strong&gt; criando nova feature em &lt;code&gt;layers/recommendations&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Menos conflitos no Git, menos "quem mexeu no meu componente?", menos stress.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Onboarding Simplificado
&lt;/h3&gt;

&lt;p&gt;Novo dev no time? Em vez de explicar a arquitetura inteira:&lt;/p&gt;

&lt;p&gt;"Você vai cuidar do catálogo. Está tudo em &lt;code&gt;layers/catalog&lt;/code&gt;. É como se fosse uma aplicação Vue separada, mas integrada com o resto."&lt;/p&gt;

&lt;p&gt;Pronto. Em 5 minutos a pessoa já está produtiva.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Boundaries Naturais e Encapsulamento
&lt;/h3&gt;

&lt;p&gt;Cada layer expõe apenas o que precisa ser público. O resto fica encapsulado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// layers/cart/index.ts - Interface pública&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useCart&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./composables/useCart&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;CartButton&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./components/CartButton&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="c1"&gt;// CartDrawer, CartLogic, etc. ficam privados&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Preparação para o Futuro
&lt;/h3&gt;

&lt;p&gt;Hoje você tem um monólito modular. Amanhã, se precisar, pode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extrair uma layer como pacote NPM&lt;/li&gt;
&lt;li&gt;Transformar em micro-frontend&lt;/li&gt;
&lt;li&gt;Mover para um repo separado&lt;/li&gt;
&lt;li&gt;Criar uma aplicação independente&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A arquitetura já está pronta para evolução.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cenários Onde Brilha (e Onde Não)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cenários Perfeitos ✅
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. E-commerce Médio/Grande&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Domínios claros: Catálogo, Produto, Carrinho, Checkout, User&lt;/li&gt;
&lt;li&gt;Features complexas mas independentes&lt;/li&gt;
&lt;li&gt;Múltiplos times ou desenvolvedores&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Aplicações SaaS B2B&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dashboard, Reports, Settings, Integrations&lt;/li&gt;
&lt;li&gt;Cada módulo com suas próprias regras e complexidades&lt;/li&gt;
&lt;li&gt;Necessidade de evolução independente&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Portais e Marketplaces&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Área do vendedor, área do comprador, admin&lt;/li&gt;
&lt;li&gt;Diferentes experiências e necessidades&lt;/li&gt;
&lt;li&gt;Times especializados por área&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Aplicações Multi-tenant&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Core compartilhado&lt;/li&gt;
&lt;li&gt;Customizações por cliente em layers separadas&lt;/li&gt;
&lt;li&gt;Facilita white-label&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Onde Talvez Não Faça Sentido ❌
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Landing Pages e Sites Institucionais&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Poucos componentes&lt;/li&gt;
&lt;li&gt;Sem domínios claros de negócio&lt;/li&gt;
&lt;li&gt;Complexidade desnecessária&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. MVPs e Protótipos&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Velocidade &amp;gt; Estrutura&lt;/li&gt;
&lt;li&gt;Mudanças constantes de escopo&lt;/li&gt;
&lt;li&gt;Time muito pequeno (1-2 devs)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3. Aplicações Hipersimples&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CRUD básico&lt;/li&gt;
&lt;li&gt;Menos de 20 componentes&lt;/li&gt;
&lt;li&gt;Sem perspectiva de crescimento&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Comparação com Outras Abordagens
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Monorepo com Workspaces
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;monorepo/
├── packages/
│   ├── cart/
│   ├── product/
│   └── shared/
└── apps/
    └── main-app/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Prós do Monorepo:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Separação física total&lt;/li&gt;
&lt;li&gt;Versionamento independente&lt;/li&gt;
&lt;li&gt;Pode publicar no NPM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Prós do Nuxt Layers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Menos complexidade de configuração&lt;/li&gt;
&lt;li&gt;Build único e otimizado&lt;/li&gt;
&lt;li&gt;Melhor DX (developer experience)&lt;/li&gt;
&lt;li&gt;HMR funcionando perfeitamente&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Micro-frontends
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Micro-frontends&lt;/strong&gt; são o extremo da modularização - aplicações completamente independentes que se juntam no browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quando Micro-frontends fazem sentido:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Times completamente independentes&lt;/li&gt;
&lt;li&gt;Tecnologias diferentes (Vue + React + Angular)&lt;/li&gt;
&lt;li&gt;Deploy independente é crítico&lt;/li&gt;
&lt;li&gt;Escala massiva (100+ devs)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Quando Nuxt Layers é melhor:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Time único ou poucos times&lt;/li&gt;
&lt;li&gt;Stack Vue/Nuxt padronizada&lt;/li&gt;
&lt;li&gt;Quer evitar complexidade de orquestração&lt;/li&gt;
&lt;li&gt;Performance é prioridade&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Implementando na Prática: Exemplo Simples
&lt;/h2&gt;

&lt;p&gt;Vamos ver um exemplo minimalista de como estruturar um blog + loja:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// nuxt.config.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineNuxtConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;extends&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./layers/base&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// Compartilhados&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./layers/blog&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;    &lt;span class="c1"&gt;// Blog com Nuxt Content&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./layers/shop&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;     &lt;span class="c1"&gt;// Loja simples&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// layers/blog/nuxt.config.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineNuxtConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;modules&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@nuxt/content&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;

  &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;sources&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;blog&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;prefix&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/blog&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;base&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./layers/blog/content&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vue"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- layers/shop/pages/shop.vue --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Nossa Loja&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ProductGrid&lt;/span&gt; &lt;span class="na"&gt;:products=&lt;/span&gt;&lt;span class="s"&gt;"products"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="c"&gt;&amp;lt;!-- ProductGrid está em layers/shop/components/ --&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;template&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt; &lt;span class="na"&gt;setup&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="c1"&gt;// Tudo local ao domínio shop&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useShopStore&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;../stores/shop&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;shop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useShopStore&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;products&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;shop&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loadProducts&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="k"&gt;script&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Migração Gradual: O Segredo do Sucesso
&lt;/h2&gt;

&lt;p&gt;A beleza desta arquitetura é que você não precisa reescrever tudo. Pode migrar gradualmente:&lt;/p&gt;

&lt;h3&gt;
  
  
  Fase 1: Identificar Domínios
&lt;/h3&gt;

&lt;p&gt;Liste os domínios óbvios da sua aplicação. Geralmente são as "grandes áreas" que os usuários veem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fase 2: Criar Layer Base
&lt;/h3&gt;

&lt;p&gt;Mova componentes compartilhados, utils, composables genéricos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fase 3: Migrar um Domínio Piloto
&lt;/h3&gt;

&lt;p&gt;Escolha o domínio mais isolado (geralmente algo como "About" ou "Blog") e migre como teste.&lt;/p&gt;

&lt;h3&gt;
  
  
  Fase 4: Expandir Gradualmente
&lt;/h3&gt;

&lt;p&gt;Um domínio por vez, conforme o time tem tempo. Não é um big bang, é evolução.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Futuro é Modular
&lt;/h2&gt;

&lt;p&gt;A arquitetura modular não é apenas uma moda ou uma forma diferente de organizar pastas. É uma mudança fundamental em como pensamos sobre a estrutura de aplicações frontend.&lt;/p&gt;

&lt;p&gt;Como &lt;a href="https://ddd.academy/eric-evans/" rel="noopener noreferrer"&gt;Eric Evans&lt;/a&gt; explica em &lt;a href="https://www.amazon.com.br/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215" rel="noopener noreferrer"&gt;Domain-Driven Design&lt;/a&gt;, software deve refletir o domínio do negócio. Com Nuxt Layers, finalmente temos uma forma elegante de fazer isso no frontend.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão: Pronto para o Próximo Passo?
&lt;/h2&gt;

&lt;p&gt;Se você chegou até aqui, provavelmente está pensando: "Ok, a teoria é linda, mas como eu implemento isso de verdade?"&lt;/p&gt;

&lt;p&gt;Ótima pergunta! No próximo artigo, vamos sair da teoria e construir um &lt;strong&gt;e-commerce completo&lt;/strong&gt; do zero usando Nuxt Layers. Vamos implementar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sistema de catálogo com filtros e busca&lt;/li&gt;
&lt;li&gt;Páginas de produto com galeria e reviews&lt;/li&gt;
&lt;li&gt;Carrinho de compras com persistência&lt;/li&gt;
&lt;li&gt;Integração real entre as layers&lt;/li&gt;
&lt;li&gt;Testes, deploy e otimizações&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com código real, funcionando, que você pode copiar e adaptar.&lt;/p&gt;




&lt;h3&gt;
  
  
  Recursos para se Aprofundar
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://nuxt.com/docs/guide/going-further/layers" rel="noopener noreferrer"&gt;&lt;strong&gt;Documentação Oficial Nuxt Layers&lt;/strong&gt;&lt;/a&gt; - A fonte definitiva&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://davestewart.co.uk/blog/nuxt-layers/" rel="noopener noreferrer"&gt;&lt;strong&gt;Nuxt Layers Unwrapped&lt;/strong&gt;&lt;/a&gt; - Artigo detalhado de Dave Stewart&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.amazon.com/Domain-Driven-Design-Tackling-Complexity-Software/dp/0321125215" rel="noopener noreferrer"&gt;&lt;strong&gt;Domain-Driven Design&lt;/strong&gt;&lt;/a&gt; - Eric Evans sobre modelagem por domínio&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.thoughtworks.com/insights/books/building-evolutionary-architectures" rel="noopener noreferrer"&gt;&lt;strong&gt;Building Evolutionary Architectures&lt;/strong&gt;&lt;/a&gt; - Sobre arquiteturas que evoluem&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>nuxt</category>
      <category>vue</category>
      <category>frontend</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Configuração e instalação do Nuxt 3</title>
      <dc:creator>Gabriel Caiana</dc:creator>
      <pubDate>Thu, 02 Feb 2023 20:08:00 +0000</pubDate>
      <link>https://forem.com/gabrielcaiana/configuracao-e-instalacao-do-nuxt-3-2d83</link>
      <guid>https://forem.com/gabrielcaiana/configuracao-e-instalacao-do-nuxt-3-2d83</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9m1epcb2yd6af2b1csl5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9m1epcb2yd6af2b1csl5.png" alt="logo nuxtjs" width="492" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O Nuxt 3 é uma ferramenta poderosa para desenvolvimento de aplicações Vue.js. É uma abordagem baseada em framework que oferece uma série de recursos para ajudar você a criar aplicações avançadas com facilidade. Neste artigo, vamos cobrir os passos para configurar e instalar o Nuxt 3.&lt;/p&gt;

&lt;h2&gt;
  
  
  Instalação do Nuxt 3
&lt;/h2&gt;

&lt;p&gt;A maneira mais fácil de instalar o Nuxt 3 é usando o CLI (Command Line Interface) Nuxt. Para fazer isso, você precisa ter o Node.js e o NPM (Node Package Manager) instalados em sua máquina. Depois de instalá-los, você pode executar o seguinte comando no seu terminal:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx create-nuxt-app nome_da_sua_aplicacao&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuração do Nuxt 3
&lt;/h2&gt;

&lt;p&gt;Após a instalação, você precisará configurar o Nuxt 3 para atender às suas necessidades. A configuração principal é feita no arquivo nuxt.config.js, localizado na raiz da sua aplicação. Nesse arquivo, você pode especificar configurações como o título da sua aplicação, descrição, etc.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inicialização do Nuxt 3
&lt;/h2&gt;

&lt;p&gt;Depois de configurar o Nuxt 3, você pode iniciá-lo executando o seguinte comando no terminal:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm run dev&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Isso fará com que o Nuxt 3 inicie em modo de desenvolvimento, permitindo que você visualize sua aplicação em seu navegador.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Como você pode ver, a configuração e instalação do Nuxt 3 são simples e diretas. Além disso, o Nuxt 3 fornece uma série de recursos e opções para ajudá-lo a criar aplicações avançadas com facilidade.&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>cryptocurrency</category>
      <category>blockchain</category>
      <category>offers</category>
    </item>
    <item>
      <title>Como adicionar a análise de pacotes do webpack em seu projeto nuxt</title>
      <dc:creator>Gabriel Caiana</dc:creator>
      <pubDate>Thu, 02 Feb 2023 19:35:29 +0000</pubDate>
      <link>https://forem.com/gabrielcaiana/como-adicionar-a-analise-de-pacotes-do-webpack-em-seu-projeto-nuxt-28da</link>
      <guid>https://forem.com/gabrielcaiana/como-adicionar-a-analise-de-pacotes-do-webpack-em-seu-projeto-nuxt-28da</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Visualize o tamanho dos arquivos de saída do webpack com um mapa de árvore interativo dentro do seu projeto com nuxtjs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fds2ofox0xppqfeu63js0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fds2ofox0xppqfeu63js0.png" alt="webpack analyzer" width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sabemos como é importante colocar em produção aplicações que tenham o melhor desempenho possível, porém conforme começamos a desenvolver um projeto adicionamos diversos pacotes para determinadas tarefas e no final isso terá um impacto no desempenho da aplicação, como podemos análisar isso utilizando o nuxtjs?&lt;/p&gt;

&lt;p&gt;Recentemente descobri uma forma muito fácil e interativa para mapear e análisar os pacotes que estão sendo utilizados no projeto, podemos criar um comando simples no package.json da seguinte forma:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;"scripts": {&lt;br&gt;
  "dev": "nuxt",&lt;br&gt;
  "build": "nuxt build",&lt;br&gt;
  "analyze": "nuxt build --analyze"&lt;br&gt;
}&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;ou podemos executar direto no terminal com yarn&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn build --analyze&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;ou até mesmo utilizando o comando npx&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx nuxt build --analyze&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;com isso o webpack analyzer deve ser inicializado em seu navegador e com isso podemos visualizar toda a árvore de pacotes que o projeto está utilizando&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvd8pxyisszvblurutkau.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvd8pxyisszvblurutkau.png" alt="gif utilizando o webpack analyzer" width="800" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Temos também uma barra a esquerda que permite que você escolha quais pedaços mostrar com os seus devidos tamanhos. podemos ver um exemplo disso na imagem abaixo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1mcdiuk6ji1tgbqfwn9r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1mcdiuk6ji1tgbqfwn9r.png" alt="arquivos do projeto" width="672" height="1600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você também pode clicar duas vezes nas caixas, passar o mouse sobre elas para obter mais detalhes e clicar com o botão direito em um pedaço para ocultá-lo facilmente ou para ocultar todos os outros pedaços.&lt;/p&gt;

&lt;p&gt;Espero que esse artigo possa ajudar você a analisar seu projeto e melhora-lo, vejo você no próximo post.&lt;/p&gt;

&lt;p&gt;Link: [&lt;a href="https://www.npmjs.com/package/webpack-bundle-analyzer" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/webpack-bundle-analyzer&lt;/a&gt;]&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>cryptocurrency</category>
      <category>airdrop</category>
      <category>web3</category>
    </item>
  </channel>
</rss>
