# Nuxt 4 em 2026: nova estrutura de diretórios e migração do Nuxt 3
> Guia completo de migração para o Nuxt 4: estrutura de diretórios app/, camada singleton de busca de dados, melhorias no TypeScript e instruções passo a passo com exemplos de código.
- Published: 2026-05-01
- Updated: 2026-05-01
- Author: SharpSkill
- Tags: nuxt, vue, migração, typescript, tutorial
- Reading time: 8 min
---
O Nuxt 4 introduz uma estrutura de diretórios redesenhada que separa o código da aplicação da configuração, acompanhada de uma camada singleton de busca de dados, reatividade superficial por padrão e contextos TypeScript divididos. Lançado em julho de 2025 e atualmente na versão 4.4, essa atualização major prioriza a evolução ao invés da revolução, tornando o caminho de migração do Nuxt 3 consideravelmente mais suave do que a transição do Nuxt 2 para o 3.
> **Migração automatizada disponível**
>
> A equipe do Nuxt firmou parceria com o Codemod para automatizar a maioria dos passos da migração. Basta executar `npx codemod@latest nuxt/4/migration-recipe` para lidar com a reestruturação de diretórios, atualizações de busca de dados e substituição de APIs obsoletas automaticamente.
## A nova estrutura do diretório app/ no Nuxt 4
O Nuxt 4 move todo o código-fonte da aplicação para um diretório `app/` por padrão. Essa separação resolve um problema real: os observadores de arquivos no Linux e Windows têm um desempenho significativamente melhor quando o código da aplicação fica em um subdiretório dedicado, em vez de misturado com `node_modules/`, `.git/` e arquivos de configuração.
A nova organização segue esta estrutura:
```text
my-nuxt-app/
├─ app/
│ ├─ assets/
│ ├─ components/
│ ├─ composables/
│ ├─ layouts/
│ ├─ middleware/
│ ├─ pages/
│ ├─ plugins/
│ ├─ utils/
│ ├─ app.vue
│ ├─ app.config.ts
│ └─ error.vue
├─ content/
├─ public/
├─ shared/ # Novo: código compartilhado entre app e servidor
├─ server/
└─ nuxt.config.ts
```
O diretório `shared/` é uma adição notável. Qualquer composable ou utilitário colocado em `shared/` é auto-importado tanto na aplicação Vue quanto no servidor Nitro, eliminando a necessidade de importações manuais ao compartilhar schemas de validação, definições de tipos ou funções utilitárias entre os dois contextos.
## Migração passo a passo do Nuxt 3 para o Nuxt 4
O processo de atualização começa com um único comando. O Nuxt detecta a estrutura plana existente e continua funcionando sem nenhuma alteração, permitindo que a migração aconteça de forma incremental.
```bash
# Atualizar o Nuxt e deduplicar dependências
npx nuxt upgrade --dedupe
```
Após atualizar o pacote, é necessário mover os arquivos da aplicação para o diretório `app/`:
```bash
# Automatizar a reestruturação de diretórios
npx codemod@latest nuxt/4/file-structure
```
Esse codemod move `assets/`, `components/`, `composables/`, `layouts/`, `middleware/`, `pages/`, `plugins/`, `utils/`, `app.vue`, `error.vue` e `app.config.ts` para dentro de `app/`. Arquivos que pertencem à raiz — `nuxt.config.ts`, `server/`, `public/` e `content/` — permanecem no lugar.
Para projetos que precisam adiar a reestruturação, o diretório fonte pode ser configurado explicitamente:
```typescript
// nuxt.config.ts
export default defineNuxtConfig({
srcDir: '.',
dir: { app: 'app' },
})
```
Essa configuração instrui o Nuxt 4 a resolver os arquivos a partir da raiz do projeto, replicando exatamente o comportamento do Nuxt 3.
## Camada singleton de busca de dados e chaves reativas
O Nuxt 4 muda fundamentalmente a forma como `useAsyncData` e `useFetch` gerenciam os dados. Múltiplos componentes chamando a mesma chave agora compartilham uma única referência reativa, em vez de manter cópias independentes.
```typescript
// app/composables/useProductData.ts
export function useProductData(productId: string) {
return useAsyncData(
`product-${productId}`,
() => $fetch(`/api/products/${productId}`),
{
getCachedData: (key, nuxtApp, ctx) => {
// ctx.cause indica o motivo do fetch
if (ctx.cause === 'refresh:manual') return undefined
return nuxtApp.payload.data[key]
},
},
)
}
```
Três mudanças se destacam nessa nova camada de dados:
- **Referências compartilhadas**: chamar `useProductData('abc')` em dois componentes retorna as mesmas refs `data`, `error` e `status`. Atualizar uma atualiza ambas.
- **Limpeza automática**: quando o último componente usando uma chave é desmontado, o Nuxt libera os dados associados da memória.
- **Chaves reativas**: encapsular uma chave em um computed ou ref dispara automaticamente um novo fetch quando o valor muda.
O callback `getCachedData` agora recebe um objeto de contexto com uma propriedade `cause` (`'initial'`, `'refresh:hook'`, `'refresh:manual'` ou `'watch'`), permitindo controle granular sobre quando servir dados em cache versus buscar dados atualizados.
> **Valores padrão alterados**
>
> As propriedades data e error de `useAsyncData`/`useFetch` agora têm `undefined` como valor padrão em vez de `null`. É necessário atualizar as verificações `=== null` para `=== undefined` ou utilizar uma comparação não estrita.
## Reatividade superficial por padrão para melhor desempenho
O Nuxt 4 altera `data` de `useAsyncData` e `useFetch` para `shallowRef` em vez de `ref`. O Vue não rastreia mais recursivamente cada propriedade aninhada, o que oferece melhorias de desempenho mensuráveis para respostas de API com objetos profundamente aninhados ou arrays grandes.
```typescript
// app/pages/dashboard.vue
```
Para a maioria das exibições somente leitura (dashboards, listagens de produtos, páginas de artigos), a reatividade superficial funciona sem nenhuma alteração de código. A opção `deep: true` continua disponível para formulários ou interfaces interativas que modificam propriedades aninhadas diretamente.
## Separação de contextos TypeScript e segurança de tipos aprimorada
O Nuxt 4 gera configurações TypeScript separadas para cada contexto do projeto:
- `.nuxt/tsconfig.app.json` — Código da aplicação Vue
- `.nuxt/tsconfig.server.json` — Código do servidor Nitro
- `.nuxt/tsconfig.shared.json` — Utilitários compartilhados
- `.nuxt/tsconfig.node.json` — Configuração em tempo de build
Essa separação significa que o IDE não sugere mais APIs exclusivas do servidor no código do cliente, e vice-versa. Um único `tsconfig.json` na raiz do projeto referencia as quatro configurações:
```json
{
"files": [],
"references": [
{ "path": "./.nuxt/tsconfig.app.json" },
{ "path": "./.nuxt/tsconfig.server.json" },
{ "path": "./.nuxt/tsconfig.shared.json" },
{ "path": "./.nuxt/tsconfig.node.json" }
]
}
```
A verificação de tipos no CI também muda. O comando `vue-tsc` agora requer a flag `-b` (modo build) para processar corretamente as referências de projeto:
```bash
# Antes (Nuxt 3)
nuxt prepare && vue-tsc --noEmit
# Depois (Nuxt 4)
nuxt prepare && vue-tsc -b --noEmit
```
Outra mudança no TypeScript: `compilerOptions.noUncheckedIndexedAccess` está ativado por padrão (`true`). Acessar um elemento de array ou propriedade de objeto por índice agora retorna `T | undefined`, capturando erros potenciais em tempo de execução durante a compilação.
## Nomes de componentes normalizados e Vue Router v5
O Nuxt 4.3 realizou a atualização para o Vue Router v5, removendo a dependência do `unplugin-vue-router`. Para a maioria das aplicações, essa atualização é transparente.
As convenções de nomenclatura de componentes estão agora padronizadas. Um componente localizado em `components/dashboard/MetricsCard.vue` recebe o nome `DashboardMetricsCard` de forma consistente em todos os contextos — incluindo ``, Vue DevTools e utilitários de teste.
```vue
```
Projetos que utilizam `` com filtros de nomes de componentes precisam atualizar os nomes para corresponder a essa nova convenção. O comportamento anterior, onde o nome podia variar dependendo do contexto, não se aplica mais.
## Lidando com mudanças importantes no gerenciamento do head
O Nuxt 4 vem com o Unhead v2, que remove diversas propriedades obsoletas de `useHead` e `useSeoMeta`:
```typescript
// app/pages/product/[id].vue
```
Para projetos que dependem de parâmetros de template ou ordenação por alias, essas funcionalidades devem ser instaladas como plugins explícitos:
```typescript
// app/plugins/unhead.ts
import { TemplateParamsPlugin, AliasSortingPlugin } from '@unhead/vue/plugins'
export default defineNuxtPlugin({
setup() {
const unhead = injectHead()
unhead.use(TemplateParamsPlugin)
unhead.use(AliasSortingPlugin)
},
})
```
> **Cronograma de suporte do Nuxt 3**
>
> O Nuxt 3 continua recebendo atualizações de segurança e correções de bugs críticos até 31 de julho de 2026. Após essa data, o Nuxt 3 não terá mais suporte. Planejar a migração agora evita manter aplicações em produção em um framework sem manutenção.
## Checklist de migração e armadilhas comuns
O codemod automatizado lida com a maioria das mudanças, mas vários itens exigem atenção manual:
- **Remoção do `window.__NUXT__`**: substituir por `useNuxtApp().payload`. Esse objeto global é removido após a hidratação no Nuxt 4.
- **Hook `pages:extend`**: trocar para o novo hook `pages:resolved`, que é executado após a varredura dos metadados das páginas.
- **Booleano `dedupe`**: substituir `refresh({ dedupe: true })` por `refresh({ dedupe: 'cancel' })` e `false` por `'defer'`.
- **Estilos inline**: apenas os estilos de componentes Vue são inseridos inline por padrão; o CSS global é carregado como arquivos separados. Adicionar `features: { inlineStyles: true }` para restaurar o comportamento do Nuxt 3.
- **`clearNuxtState`**: agora redefine para os valores iniciais em vez de `undefined`. Usar `clearNuxtState('key', { reset: false })` para manter o comportamento anterior.
Uma sequência de migração prática para aplicações em produção:
1. Executar `npx nuxt upgrade --dedupe` e verificar se a aplicação compila corretamente
2. Rodar o codemod: `npx codemod@latest nuxt/4/migration-recipe`
3. Mover arquivos para `app/` (automatizado pelo codemod file-structure)
4. Atualizar as verificações de `null` para `undefined` na lógica de busca de dados
5. Testar os componentes `` com os nomes normalizados
6. Atualizar a verificação de tipos no CI para usar `vue-tsc -b --noEmit`
7. Rodar a suíte completa de testes e corrigir os erros TypeScript expostos pelo `noUncheckedIndexedAccess`
Para aprofundar os conceitos de Vue e Nuxt, é possível explorar as [questões de entrevista Vue/Nuxt](/technologies/vue-nuxt/interview-questions/nuxt-fundamentals) no SharpSkill, ou consultar o [guia de SSR e geração estática](/blog/vue-nuxt/nuxt-3-ssr-static-generation) para obter contexto sobre estratégias de renderização que também se aplicam ao Nuxt 4.
## Conclusão
- O Nuxt 4.4 (versão atual em abril de 2026) estabiliza a estrutura do diretório `app/`, a busca de dados singleton e os contextos TypeScript divididos como padrões prontos para produção
- O comando `npx codemod@latest nuxt/4/migration-recipe` automatiza a reestruturação de diretórios, a substituição de APIs obsoletas e as atualizações de busca de dados
- A reatividade superficial via `shallowRef` melhora o desempenho de páginas de leitura intensiva sem exigir alterações de código na maioria dos casos
- As configurações TypeScript separadas por contexto (app, server, shared, node) eliminam vazamentos de tipos entre contextos e melhoram o autocompletar do IDE
- O Nuxt 3 atinge o fim de vida em 31 de julho de 2026 — migrar antes dessa data garante que as aplicações operem em uma versão com suporte e manutenção ativa
- O Vue Router v5 e o Unhead v2 trazem APIs mais limpas ao custo de remover propriedades obsoletas que devem ser auditadas durante a migração
---
Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack.
HTML version of this page: https://sharpskill.dev/pt/blog/vue-nuxt/nuxt-4-directory-structure-migration