404 Not Found

404 Not Found


nginx

Introdução ao Nuxt 3 e o Conceito de SSR

Charlie está selecionando a stack tecnológica para sua plataforma de e-commerce, MegaShop—com milhões de páginas de produtos, ele precisa de SEO de ponta, e a página deve carregar rapidamente na primeira tela. Soluções tradicionais de CSR impedem que os motores de busca rastreiem os dados dos produtos, resultando em tráfego miserável. As capacidades de SSR do Nuxt 3 são exatamente o que ele precisa.

1. O Que Você Vai Aprender


2. Uma História Real de um Arquiteto

(1) Dor: CSR Torna Milhões de Páginas de Produtos "Invisíveis"

A MegaShop do Charlie tem mais de 1 milhão de páginas de produtos, mas após mudar para CSR puro (renderização no lado do cliente), o crawler do Google só conseguia obter um <div id="app"></div> vazio—com títulos, preços e descrições dos produtos todos ausentes. Os rankings de SEO despencaram para a página 5; Alice (a consumidora) não conseguia encontrar os produtos de jeito nenhum, e Bob (o administrador) estava preocupado com o tráfego orgânico quase zero.

(2) Solução com Nuxt 3 SSR

O Nuxt 3 renderiza HTML no lado do servidor, então os crawlers recebem a página de produto completa—com título, preço e dados estruturados. Charlie só precisa criar um projeto, e o SSR já está pronto para uso:

BASH
# Criar projeto Nuxt 3 com SSR habilitado por padrão
npx nuxi@latest init megashop

(3) Benefícios: Um Surto de Tráfego SEO

Após mudar para o SSR do Nuxt 3, as páginas indexadas pelo Google da MegaShop saltaram de 2.000 para 800.000, o tráfego orgânico cresceu 340%, e o tempo de carregamento above-the-fold caiu de 4,2 segundos para 1,1 segundo.


3. A Relação Entre Nuxt 3 e Vue 3

O Nuxt 3 é um framework full-stack baseado no Vue 3, liderado por Sébastien Chopin, membro do core team do Vue.

(1) Comparação de Posicionamento

Dimensão Vue 3 Nuxt 3
Posicionamento Framework UI Progressivo Meta-Framework Full-stack Vue 3
Renderização Apenas CSR SSR / CSR / SSG / ISR / ESR
Rotas Configurar vue-router manualmente Rotas baseadas em arquivos geradas automaticamente
Recuperação de Dados Wrapping Manual useFetch / useAsyncData
Build Requer Vite/Webpack Vite Integrado
Lado do Servidor Nenhum Motor de Servidor Nitro
Auto-import Nenhum Componentes/Composables/Funções Utilitárias

(2) O Valor Core do Nuxt 3

💡 Dica: O Nuxt 3 não é um substituto do Vue 3, mas sim um framework de nível empresarial que se baseia no Vue 3 para fornecer capacidades de engenharia full-stack.


4. Comparação dos Cinco Modos de Renderização

(1) Visão Panorâmica dos Modos de Renderização

100%
flowchart TB
    A[Requisição do Usuário] --> B{Modo de Renderização}
    B -->|SSR| C[Servidor renderiza HTML<br/>em cada requisição]
    B -->|CSR| D[Navegador renderiza HTML<br/>após download do JS]
    B -->|SSG| E[HTML pré-construído<br/>no momento do build]
    B -->|ISR| F[HTML em cache +<br/>revalidação por intervalo]
    B -->|ESR| G[CDN Edge renderiza<br/>mais próximo do usuário]
    C --> H[Resposta HTML completa]
    D --> I[Shell vazio + JS bundle]
    E --> H
    F --> H
    G --> H

(2) Comparações Chave dos Cinco Modelos

Dimensão SSR CSR SSG ISR ESR
Momento da Renderização Por Requisição Lado do Navegador Momento do Build Cache + Validação Periódica Nó Edge da CDN
SEO-Friendly ✅ Excelente ❌ Ruim ✅ Excelente ✅ Excelente ✅ Excelente
Velocidade de Carregamento da Primeira Tela ⚡ Rápido 🐢 Lento ⚡⚡ Mais Rápido ⚡⚡ Rápido ⚡⚡⚡ Mais Rápido
Status em Tempo Real dos Dados ✅ Tempo real ✅ Tempo real ❌ Estático ⚠️ Atualizações agendadas ⚠️ Atualizações agendadas
Carga do Servidor 🔴 Alta 🟢 Baixa 🟢 Mais Baixa 🟡 Média 🟡 Média
Casos de Uso Páginas de Detalhe Dinâmicas Gestão de Backoffice Blog/Documentação Listas de Produtos Páginas Internacionalizadas

(3) Explicação Detalhada do Workflow do SSR

SSR (Server-Side Rendering) é o modo de renderização padrão no Nuxt 3. O processo core é o seguinte:

  1. URL de Requisição do Usuário
  2. Renderização dos Componentes Vue no Lado do Servidor Nuxt
  3. Geração de uma string HTML completa
  4. Envio do HTML para o navegador
  5. Exibição da página no navegador (visível na primeira tela)
  6. Download do arquivo JS, "hidratação" e vinculação de eventos

(1) ▶Exemplo: Comparação das Respostas SSR e CSR

HTML
<!-- Resposta SSR: HTML completo com conteúdo -->
<div id="app">
  <h1>MegaShop - Fones Premium</h1>
  <p>Preço: $299.99 USD</p>
  <p>1.2 mil avaliações</p>
</div>

<!-- Resposta CSR: shell vazio -->
<div id="app"></div>
<script src="/bundle.js"></script>

Saída:

TEXT
// Execução Bem-sucedida

(2) ▶Exemplo: Página SSR do Nuxt 3

VUE
<!-- pages/index.vue -->
<template>
  <div>
    <h1>{{ product.name }}</h1>
    <p>Preço: ${{ product.price }} USD</p>
  </div>
</template>

<script setup lang="ts">
// Dados buscados no servidor, incluídos na resposta HTML
const { data: product } = await useFetch('/api/products/featured')
</script>

Saída:

TEXT
// Execução Bem-sucedida

(3) ▶Exemplo: Página no Modo CSR

VUE
<!-- pages/dashboard.vue - página apenas no cliente -->
<template>
  <div>
    <h1>Painel de Administração</h1>
    <p>Bem-vindo, Bob</p>
  </div>
</template>

<script setup lang="ts">
// Forçar renderização no lado do cliente
definePageMeta({
  ssr: false
})

const { data: stats } = await useFetch('/api/admin/stats')
</script>

Saída:

TEXT
// Execução Bem-sucedida

5. Arquitetura Core do Nuxt 3

(1) Componentes da Arquitetura

100%
graph TB
    A[Nuxt 3] --> B[Vite - Ferramenta de Build]
    A --> C[Vue 3 - Framework UI]
    A --> D[Nitro - Motor do Servidor]
    A --> E[Sistema de Auto-imports]
    D --> F[H3 - Framework HTTP]
    D --> G[Camada de Storage]
    D --> H[Cache API]
    E --> I[Componentes]
    E --> J[Composables]
    E --> K[Utilitários]

(2) Responsabilidades dos Módulos Core

Módulo Responsabilidades Aplicação na MegaShop
Vite Ferramenta de build, HMR (Hot Reload Super Rápido) Atualizar páginas de produtos em segundos durante o desenvolvimento
Vue 3 Composition API + Reatividade Cards de Produto/Carrinho de Compras Baseados em Componentes
Nitro Motor do lado do servidor, múltiplos presets de deploy Rotas de API + cache ISR
Auto-imports Registro Automático de Componentes/Funções Usar useFetch diretamente sem import
H3 Framework HTTP Leve Tratamento de Requisições API e Middleware

(1) ▶Exemplo: Como Funciona o Auto-imports

VUE
<!-- Não é necessário import manual -->
<template>
  <div>
    <ProductCard :product="item" />
    <!-- ProductCard auto-importado de components/ -->
  </div>
</template>

<script setup lang="ts">
// useFetch, useState, useRouter - todos auto-importados
const { data: item } = await useFetch('/api/products/1')
const router = useRouter()
const cart = useState('cart', () => [])
</script>

Saída:

TEXT
// Execução Bem-sucedida

(2) ▶Exemplo: Rota API do Nitro

TYPESCRIPT
// server/api/products/index.ts
export default defineEventHandler(async (event) => {
  const query = getQuery(event)
  const page = Number(query.page) || 1
  const limit = Number(query.limit) || 20

  // Buscar produtos com paginação
  const products = await fetchProducts(page, limit)

  return {
    items: products,
    total: 1000000, // 1 milhão de produtos
    page,
    limit
  }
})

Saída:

TEXT
// Execução Bem-sucedida

6. Análise do Cenário da MegaShop

(1) Por Que Páginas de Produtos com Milhões de Itens Devem Usar SSR?

Necessidade Desempenho CSR Desempenho SSR
Taxa de Indexação do Google < 5% > 95%
LCP da Primeira Tela 3,5-5 s 0,8-1,5 s
Nome do produto aparece no HTML ❌ Requer JS ✅ Incluído diretamente
Suporte a Dados Estruturados ❌ Não visível aos crawlers ✅ Saída completa
Pré-visualização de Compartilhamento Social ❌ Em branco ✅ Exibe Corretamente

(1) ▶Exemplo: Saída SSR da Página de Produto da MegaShop

HTML
<!-- HTML renderizado no servidor para /products/headphones-123 -->
<!DOCTYPE html>
<html>
<head>
  <title>Fones Premium - MegaShop</title>
  <meta name="description" content="Fones sem fio premium, $299.99 USD">
  <script type="application/ld+json">
  {
    "@type": "Product",
    "name": "Premium Headphones",
    "price": "299.99",
    "priceCurrency": "USD",
    "aggregateRating": { "ratingValue": "4.8", "reviewCount": "1200" }
  }
  </script>
</head>
<body>
  <div id="app">
    <h1>Premium Headphones</h1>
    <p>$299.99 USD</p>
    <p>1.2 mil avaliações · 4.8 estrelas</p>
  </div>
</body>
</html>

Saída:

TEXT
// Execução Bem-sucedida

7. Visão Geral do Ecossistema do Nuxt 3

(1) Ecossistema de Módulos Oficiais

Módulo Função Uso na MegaShop
@nuxtjs/tailwindcss Integração com Framework CSS Layout Responsivo
@nuxt/image Otimização de Imagens Conversão WebP + Lazy Loading
@nuxtjs/i18n Internacionalização Chinês/Inglês/Japonês
@nuxtjs/sitemap Geração de Sitemap SEO para Milhões de Páginas
@pinia/nuxt Gerenciamento de Estado Carrinho de Compras/Estado do Usuário
@nuxt/devtools Ferramentas de Desenvolvedor Debug e Análise de Performance

(2) Tamanho da Comunidade

(1) ▶Exemplo: Instalando um Módulo Oficial

BASH
# Instalar módulo Tailwind CSS
npm install @nuxtjs/tailwindcss

# Instalar gerenciamento de estado Pinia
npm install @pinia/nuxt

# Instalar módulo i18n
npm install @nuxtjs/i18n

Saída:

TEXT
# Comando executado com sucesso
TYPESCRIPT
// nuxt.config.ts
export default defineNuxtConfig({
  modules: [
    '@nuxtjs/tailwindcss',
    '@pinia/nuxt',
    '@nuxtjs/i18n'
  ]
})

8. Exemplo Completo: Página de Produto SSR da MegaShop

VUE
<!-- pages/products/[id].vue -->
<template>
  <div class="product-page">
    <h1>{{ product?.name }}</h1>
    <p class="price">${{ product?.price }} USD</p>
    <p>{{ product?.reviewCount }} avaliações</p>
    <button @click="addToCart(product)">
      Adicionar ao Carrinho
    </button>
  </div>
</template>

<script setup lang="ts">
interface Product {
  id: number
  name: string
  price: number
  reviewCount: number
}

// SSR: dados buscados no servidor, incluídos no HTML inicial
const route = useRoute()
const { data: product } = await useFetch<Product>(`/api/products/${route.params.id}`)

// Metadados SEO
useHead({
  title: `${product.value?.name} - MegaShop`,
  meta: [
    { name: 'description', content: `Compre ${product.value?.name} por $${product.value?.price} USD` }
  ]
})

const cart = useState<Product[]>('cart', () => [])
function addToCart(item: Product | null) {
  if (item) cart.value.push(item)
}
</script>

❓Perguntas Frequentes

P Qual é a diferença entre Nuxt 3 e Next.js?
R O Nuxt 3 é baseado em Vue 3 + Vite, enquanto o Next.js é baseado em React + Webpack/Turbopack. O Nuxt 3 oferece auto-imports e convenções de arquivo mais abrangentes, e seu motor Nitro suporta mais presets de deploy.
P O SSR vai sobrecarregar o servidor?
R Para páginas com alto tráfego, você pode usar cache ISR ou renderização edge ESR para reduzir a carga no servidor. O routeRules do Nuxt 3 permite configurar a estratégia de renderização independentemente para cada rota.
P Posso usar o Nuxt 3 sem SSR?
R Sim. Você pode desabilitar o SSR globalmente definindo ssr: false no nuxt.config.ts, ou desabilitá-lo para páginas individuais usando definePageMeta. Páginas administrativas tipicamente usam CSR.
P Posso usar APIs do navegador em uma página SSR?
R Não há ambiente de navegador durante a fase de SSR, então usar window ou document diretamente resultará em erro. Você precisa colocar o código dentro do hook onMounted ou usar import.meta.client para verificar o ambiente.
P O Nuxt 3 suporta TypeScript?
R Possui suporte nativo. O Nuxt 3 gera automaticamente .nuxt/tsconfig.json, e componentes, composables e APIs possuem inferência de tipos completa, sem necessidade de configuração manual.
P Como a MegaShop garante velocidades rápidas de construção de páginas para seus milhões de páginas de produtos?
R Nós não pré-construímos todas as páginas. Usamos renderização no lado do servidor (SSR) por requisição combinada com renderização no navegador (ISR) para armazenar em cache as páginas populares. Durante o processo de build, pré-renderizamos apenas páginas-chave (homepage/páginas de categorias), enquanto as páginas de detalhes de produtos usam SSR + ISR.

📖Resumo


📝Exercícios

  1. Exercício Básico (Dificuldade: ⭐): Use npx nuxi@latest init para criar um projeto Nuxt 3 e verifique se o SSR está habilitado na configuração padrão.
  2. Exercício Avançado (Dificuldade: ⭐⭐): Use useFetch na homepage do projeto para obter dados de uma API pública, depois verifique se os dados estão incluídos no "Ver Código-fonte" do navegador (para confirmar o SSR).
  3. Desafio (Dificuldade: ⭐⭐⭐): Crie uma página usando o modo CSR (definePageMeta({ ssr: false })) e compare as diferenças entre ela e uma página SSR ao visualizar o código-fonte.

---|

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%