Vue Framework

Nuxt

Nuxt é o framework Vue que adiciona roteamento baseado em arquivos, auto-imports, renderização no servidor e um motor de servidor integrado, transformando um app Vue em um projeto full-stack.

intermediate14 min readUpdated 15 de set. de 2026
users.vue
vue
<!-- pages/users.vue -->
<script setup>
const { data: users, pending, error } = await useFetch("/api/users");
</script>

<template>
  <p v-if="pending">Loading…</p>
  <p v-else-if="error">Something went wrong.</p>
  <ul v-else>
    <li v-for="user in users" :key="user.id">
      {{ user.name }}
    </li>
  </ul>
</template>
Construído sobre
Vue 3
Roteador
Baseado em arquivos (pages/)
Servidor
Motor Nitro
Dados
useFetch, useAsyncData
Renderização
SSR, SSG, SPA, híbrida
Imports
Automáticos

Por que importa

Por que desenvolvedores escolhem Nuxt

Tudo automático

Componentes, composables e APIs do Vue são importados automaticamente, então você escreve menos boilerplate e mantém os arquivos focados.

Um servidor real integrado

O motor Nitro alimenta rotas de API, middleware de servidor e múltiplos alvos de deploy a partir da mesma base de código.

Rápido por padrão

Renderização no servidor, code splitting por rota e extração de payload já vêm configurados de fábrica.

O panorama completo

As três ideias por trás do Nuxt

Um roteador de sistema de arquivos, imports automáticos e o motor de servidor Nitro trabalhando juntos em um único projeto.

O roteador de arquivos

Roteamento

Arquivos em pages/ tornam-se rotas, com layouts, rotas aninhadas e middleware de rota.

Auto-imports

Ergonomia

Componentes, composables e utilitários ficam disponíveis sem a necessidade de declarações de import.

Nitro

Servidor

Um motor de servidor que gerencia rotas de API, renderização e adaptadores de deploy.

Nuxt em resumo

O que o Nuxt adiciona ao Vue

Roteamento baseado em arquivos

A pasta pages/ mapeia arquivos para rotas, incluindo segmentos dinâmicos e aninhados.

Layouts

Compartilhe uma estrutura entre páginas e alterne layouts por rota.

useFetch & useAsyncData

Busca de dados compatível com SSR, com estados de carregamento e erro integrados.

Rotas de servidor

Escreva endpoints de API em server/api utilizando o motor Nitro.

SEO e meta

useHead e useSeoMeta gerenciam títulos, descrições e tags sociais.

Módulos

Um ecossistema rico de módulos adiciona funcionalidades com apenas uma linha de configuração.

Uma breve historia

Do Nuxt 1 a uma plataforma Vue moderna

  1. 2016

    Nuxt 1

    Nuxt traz renderização no servidor e convenções de roteamento para aplicações Vue.

    16
  2. 2018

    Nuxt 2

    Um lançamento estável e amplamente adotado com um grande ecossistema de módulos.

    18
  3. 2022

    Nuxt 3

    Uma reescrita sobre Vue 3 e Vite que introduz o servidor Nitro e a Composition API.

    22
  4. 2024

    Maturidade do Nuxt 3

    Melhor performance, uma camada de servidor unificada e suporte de primeira classe para TypeScript.

    24
  5. Hoje

    O meta-framework do Vue

    A escolha padrão para projetos Vue full-stack e com foco em conteúdo.

    Hoje

O guia completo

Nuxt: Tudo que voce precisa saber

O que é Nuxt?

Nuxt é o meta-framework do Vue. Enquanto o Vue oferece componentes e reatividade, o Nuxt adiciona as partes que toda aplicação real precisa — roteamento, renderização no servidor, busca de dados, um runtime de servidor e um ecossistema de módulos — e conecta tudo isso com configurações padrão inteligentes.

Ele é a contraparte do Vue para o Next.js e segue a mesma filosofia geral: utilizar o sistema de arquivos para o roteamento, renderizar no servidor por padrão e tratar a busca de dados como uma prioridade. Se você já conhece Vue, o Nuxt parece um próximo passo natural, em vez de um framework totalmente novo.

Roteamento baseado em arquivos

Arquivos em pages/ tornam-se rotas. Segmentos dinâmicos utilizam colchetes, e pastas aninhadas criam rotas aninhadas.

pages/
├── index.vue            # /
├── about.vue            # /about
├── blog/
│   ├── index.vue        # /blog
│   └── [slug].vue       # /blog/:slug
└── dashboard/
    ├── index.vue        # /dashboard
    └── settings.vue     # /dashboard/settings
<!-- pages/blog/[slug].vue -->
<script setup>
const route = useRoute();
const { data: post } = await useFetch(`/api/posts/${route.params.slug}`);
</script>

<template>
  <article>
    <h1>{{ post.title }}</h1>
    <div v-html="post.body" />
  </article>
</template>

useRoute fornece a rota atual, e NuxtLink gerencia a navegação no lado do cliente com prefetching. Layouts em layouts/ envolvem as páginas e permitem compartilhar um shell entre várias rotas.

Auto-imports

O Nuxt importa automaticamente as APIs do Vue, seus próprios composables, além dos seus componentes e composables. Assim, você escreve menos boilerplate e seus arquivos permanecem focados.

<!-- components/UserCard.vue -->
<script setup>
const props = defineProps({ user: Object });
</script>

<template>
  <article class="card">
    <h3>{{ user.name }}</h3>
  </article>
</template>

Componentes em components/ ficam disponíveis em qualquer lugar sem a necessidade de importação, e seus próprios composables em composables/ também são importados automaticamente. O resultado é menos cerimônia e menos listas de importação para manter.

Busca de dados com useFetch

useFetch e useAsyncData são a maneira recomendada de carregar dados. Eles são executados durante a renderização no servidor, transferem o resultado para o cliente e expõem os estados de carregamento e erro.

<!-- pages/posts.vue -->
<script setup>
const { data: posts, pending, error } = await useFetch("/api/posts");
</script>

<template>
  <p v-if="pending">Loading…</p>
  <p v-else-if="error">Could not load posts.</p>
  <PostList v-else :posts="posts" />
</template>

Como a requisição acontece no servidor, a primeira pintura (first paint) já inclui os dados. Isso evita aquele flash de conteúdo vazio que ocorre ao fazer o fetch em onMounted, e funciona com cache, revalidação e chaves customizadas para um controle mais refinado.

O servidor Nitro

O Nuxt inclui um motor de servidor chamado Nitro. Arquivos em server/api/ tornam-se endpoints de API, e server/routes/ podem servir handlers personalizados.

// server/api/users.get.ts
export default defineEventHandler(async () => {
  const config = useRuntimeConfig();
  return $fetch("https://api.example.com/users", {
    headers: { Authorization: config.apiKey },
  });
});
// server/api/users.post.ts
export default defineEventHandler(async (event) => {
  const body = await readBody(event);
  const user = await db.user.create({ data: body });
  return { user };
});

Isso mantém segredos e credenciais de terceiros no servidor. O cliente chama o seu próprio endpoint, e o Nitro cuida do restante. O mesmo motor é implantado em Node, funções serverless, edge runtimes e hosts estáticos através de adaptadores.

SEO, meta e módulos

O Nuxt torna o SEO amigável ao servidor simples através de composables.

<!-- pages/about.vue -->
<script setup>
useSeoMeta({
  title: "About us",
  description: "Who we are and what we build.",
  ogImage: "/og/about.png",
});
</script>

Os composables useHead e useSeoMeta gerenciam títulos, descrições, URLs canônicas e tags sociais, e são renderizados corretamente no servidor para que os crawlers possam visualizá-los. Além disso, o ecossistema de módulos do Nuxt adiciona autenticação, conteúdo, imagens, analytics e muito mais com apenas uma ou duas linhas de configuração.

Modos de renderização

O Nuxt suporta diversas estratégias de renderização e permite que você escolha por rota:

  • Universal (SSR) renderiza no servidor e faz a hidratação no cliente — este é o padrão.
  • Static (SSG) pré-renderiza as páginas no momento do build.
  • SPA renderiza inteiramente no cliente, como um app Vue clássico.
  • Hybrid mistura essas estratégias, permitindo que páginas de marketing sejam estáticas enquanto um dashboard seja renderizado no cliente.

Você também pode habilitar a regeneração estática incremental e regras de rota para ajustar o cache e a renderização sem precisar reestruturar o app.

Melhores práticas

  • Use useFetch e useAsyncData em vez de fazer fetch em onMounted.
  • Mantenha segredos e chamadas de terceiros em rotas server/api.
  • Deixe os auto-imports fazerem o trabalho deles; não tente forçar importações manuais.
  • Defina os metadados de SEO com useSeoMeta em cada página.
  • Escolha um modo de renderização por rota, em vez de um único modo para tudo.
  • Use NuxtLink para navegação interna para que o prefetching e as transições funcionem.
  • Organize a lógica reutilizável em composables em composables/.

Erros comuns

  • Buscar dados em onMounted e perder o benefício do SSR.
  • Expor chaves de API ao chamar terceiros diretamente do client.
  • Recorrer a um store global quando useState ou um composable seriam suficientes.
  • Ignorar as regras de rota e renderizar excessivamente páginas que poderiam ser estáticas.
  • Presumir que as APIs de módulos do Nuxt 2 funcionam sem alterações no Nuxt 3.
  • Esquecer os metadados de SEO porque o framework torna fácil ignorá-los.

Próximos passos

O Nuxt transforma o Vue em uma plataforma full-stack. Aprofunde seus conhecimentos em Vue, adicione TypeScript e compare essa abordagem com Next.js e SvelteKit. Depois, construa um pequeno app com uma página, uma server route e useFetch para sentir como as peças se encaixam naturalmente.

Busca de dados

useFetch executa no servidor durante o SSR e hidrata o resultado, evitando flashes de conteúdo e a necessidade de estado manual.

Preferir
<script setup>
const { data: posts } = await useFetch("/api/posts");
</script>

<template>
  <PostList :posts="posts" />
</template>
Evitar
<script setup>
const posts = ref([]);
onMounted(async () => {
  posts.value = await fetch("/api/posts")
    .then((r) => r.json());
});
</script>

Lógica de servidor

Mantenha segredos e chamadas de terceiros no servidor Nitro, e deixe o cliente chamar seu próprio endpoint.

Preferir
// server/api/users.get.ts
export default defineEventHandler(async () => {
  const key = useRuntimeConfig().apiKey;
  return $fetch("https://api.example.com/users", {
    headers: { Authorization: key },
  });
});
Evitar
// calling a third party directly
// from the client exposes the key
const data = await $fetch(
  "https://api.example.com/users",
  { headers: { Authorization: apiKey } },
);

Perguntas frequentes

Perguntas frequentes

Keep learning

Related topics from the roadmap.

$ comecar a aprender

Pronto para aprender Nuxt?

Nosso tutorial interativo te guia por Nuxt passo a passo — com quizzes e codigo real que voce pode executar no navegador.