Next.js: Configuração do Ambiente & Estrutura do Projeto

Última atualização: 2026-08-26

Configurar um ambiente de desenvolvimento Next.js 16 é como reformar uma casa nova—o scaffolding ajuda a lançar a fundação, e o resto da estrutura, layout e configuração pode ser ajustado conforme necessário.

1. O Que Você Vai Aprender



2. Uma História Real de um Iniciante Front-End

(1) Ponto de Dor: Leva três dias para configurar o ambiente de desenvolvimento

Charlie é um iniciante em front-end que acabou de aprender React e quer experimentar Next.js. Ele abre a documentação oficial e, diante de uma dúzia de opções de configuração e três comandos de scaffolding diferentes, não tem ideia de qual escolher:

"Com create-react-app, consigo rodar com apenas um comando. Mas com Next.js, preciso do diretório src/? Preciso de TypeScript? Preciso de ESLint? Preciso de Tailwind? Só para descobrir essas escolhas levei dois dias."

Ele também encontrou os seguintes problemas:

Problema Sintomas
Dificuldade em escolher configurações 7 opções—sem saber quais habilitar
Não entendo a estrutura de diretórios As funções de app/, public/ e styles/ não são claras
Hot reload muito lento Com Webpack, tenho que esperar 1–2 segundos cada vez que salvo
Sem assistência no VS Code Sem dicas, sem autocompletar—é como escrever no Bloco de Notas

(2) A Solução create-next-app

Use o scaffolding interativo create-next-app para gerar uma estrutura de projeto com boas práticas com um único clique.

BASH
# Um comando interativo, Basta responder algumas perguntas simples
npx create-next-app@latest taskflow --ts --tailwind --app --src-dir --import-alias "@/*"

(3) Resultados

Dimensão Antes (configuração manual) Depois (create-next-app)
Tempo de Configuração do Projeto 2 dias de pesquisa 3 minutos
Velocidade HMR 1-2s (Webpack) 3-10ms (Turbopack)
Dicas de Código Nenhuma Autocompletar JSX + dicas de nomes de classe Tailwind
Compreensão do Sumário Confusão Organizado por função, fácil de entender


3. O Scaffolding create-next-app

(1) Criação Interativa

BASH
# Executar o comando de scaffolding
npx create-next-app@latest

Você verá as seguintes opções interativas:

TEXT 📖 Somente leitura
? What is your project named?  taskflow
? Would you like to use TypeScript?  Yes / No
? Would you like to use ESLint?  Yes / No
? Would you like to use Tailwind CSS?  Yes / No
? Would you like to use `src/` directory?  Yes / No
? Would you like to use App Router? (recommended)  Yes / No
? Would you like to customize the import alias (`@/*` by default)?  No

(2) Configuração Recomendada (Usada Neste Tutorial)

BASH
# Opções Recomendadas Para Este Curso(Todos os projetos usam este conjunto)
npx create-next-app@latest taskflow ^
  --typescript ^
  --eslint ^
  --tailwind ^
  --src-dir ^
  --app ^
  --import-alias "@/*"
Opção Valor Razão
TypeScript Sim Padrão para projetos de nível de produção, segurança de tipos
ESLint Sim Garantia de qualidade de código
Tailwind CSS Sim Usado em todo este tutorial
src/ directory Sim Separação de código e configuração
App Router Sim Sistema de roteamento padrão do Next.js 16
Import Alias @/* Caminho de importação conciso

▶ Exemplo: Processo Completo para Criar Scaffolding

BASH
# ============================================
---
# Criar um arquivo chamado shophub Novo Projeto
---
# ============================================

npx create-next-app@latest shophub --ts --tailwind --app --src-dir

# Saída do Console
cd shophub
npm run dev

Saída:

TEXT 📖 Somente leitura
Creating a new Next.js project in C:\Users\Charlie\shophub.

✔ Would you like to use TypeScript? … Yes
✔ Would you like to use ESLint? … Yes
✔ Would you like to use Tailwind CSS? … Yes
✔ Would you like to use `src/` directory? … Yes
✔ Would you like to use App Router? (recommended) … Yes
✔ Would you like to customize the import alias? … @/*

Success! Created shophub at shophub
Inside that directory, you can run:
  npm run dev       # Iniciar o servidor de desenvolvimento
  npm run build     # Construir a versão de produção
  npm start         # Iniciar o servidor de produção

(3) Estrutura do Projeto Gerada pelo Scaffold

100%
graph TB
    A[shophub/] --> B[src/]
    A --> C[public/]
    A --> D[Outros Arquivos de Configuração]
    B --> E[app/]
    B --> F[app/globals.css]
    B --> G[app/layout.tsx]
    B --> H[app/page.tsx]
    C --> I[favicon.ico]
    C --> J[Imagens e outros recursos estáticos]
    D --> K[package.json]
    D --> L[tsconfig.json]
    D --> M[next.config.ts]
    D --> N[tailwind.config.ts]
    D --> O[postcss.config.mjs]

    style B fill:#d4edda
    style C fill:#f8d7da
    style E fill:#cce5ff


4. Explicação Detalhada da Estrutura de Diretórios do Projeto

(1) src/app/ — O Núcleo do Código da Sua Aplicação

Arquivo Finalidade Obrigatório?
layout.tsx Layout raiz (envolve todas as páginas) ✅ Obrigatório
page.tsx Início (Roteado via /) ✅ Obrigatório
globals.css Estilos Globais Recomendado
favicon.ico Ícone do Site Opcional

▶ Exemplo: O arquivo padrão app/page.tsx

Saída:

TEXT 📖 Somente leitura
Diagrama: shophub/; src/; public/; Outros Arquivos de Configuração; app/; app/globals.css.
TSX
// ============================================
// create-next-app Página Inicial Padrão
// ============================================

import Image from "next/image";

export default function Home() {
  return (
    <div className="grid grid-rows-[20px_1fr_20px] items-center justify-items-center min-h-screen p-8 pb-20 gap-16 sm:p-20 font-[family-name:var(--font-geist-sans)]">
      <main className="flex flex-col gap-8 row-start-2 items-center sm:items-start">
        <Image
          className="dark:invert"
          src="/next.svg"
          alt="Next.js logo"
          width={180}
          height={38}
          priority
        />
        <ol className="list-inside list-decimal text-sm text-center sm:text-left font-[family-name:var(--font-geist-mono)]">
          <li className="mb-2">
            Get started by editing{" "}
            <code className="bg-black/[.05] dark:bg-white/[.06] px-1 py-0.5 rounded font-semibold">
              src/app/page.tsx
            </code>
          </li>
          <li>Save and see your changes instantly.</li>
        </ol>
        <div className="flex gap-4 items-center flex-col sm:flex-row">
          <a className="...">Deploy now</a>
          <a className="...">Read our docs</a>
        </div>
      </main>
    </div>
  );
}

Saída:

TEXT 📖 Somente leitura
Renderiza: Componente Home com elementos UI descritos.

Saída:

TEXT 📖 Somente leitura
Abra em um navegador http://localhost:3000, Como você pode ver:
- Logo Oficial Next.js
- "Get started by editing src/app/page.tsx" Apresentação
- "Deploy now" e "Read our docs" dois links
- Tema Escuro/Claro Responsivo

(2) public/ — Diretório de Recursos Estáticos

TEXT 📖 Somente leitura
public/
├── favicon.ico      # Ícone da Aba do Navegador
├── file.svg         # Ícone de Tipo de Arquivo
├── globe.svg        # Ícone da Terra
├── next.svg         # Logo Next.js
├── vercel.svg       # Logo Vercel
└── window.svg       # Ícone de Janela

Todos os arquivos localizados em public/ podem ser acessados diretamente via o caminho raiz /:

TSX
// Referenciar em um componente public Imagens no diretório
<img src="/logo.png" alt="Logo" />
// ou usar next/image Componentes
import Image from 'next/image';
<Image src="/logo.png" alt="Logo" width={200} height={100} />

(3) Arquivo de Configuração Raiz

Arquivo Finalidade Frequência de Modificação
next.config.ts Configuração de tempo de compilação do Next.js Baixa (configurado no início do projeto)
tsconfig.json Opções de compilação TypeScript Baixa
tailwind.config.ts Temas/Plugins Tailwind CSS Média (Adicionar Cores Personalizadas)
postcss.config.mjs Configuração do plugin PostCSS Muito baixa
package.json Dependências do Projeto + Scripts NPM Média (ao adicionar dependências)
.eslintrc.json Regra ESLint Baixa

▶ Exemplo: Configurando next.config.ts

Saída:

TEXT 📖 Somente leitura
TypeScript compilado.
TS
// ============================================
// next.config.ts — Configuração de Tempo de Compilação Next.js
// ============================================

import type { NextConfig } from "next";

const nextConfig: NextConfig = {
  // Permitir que imagens externas sejam carregadas de domínios especificados
  images: {
    remotePatterns: [
      {
        protocol: "https",
        hostname: "fakestoreapi.com",
      },
      {
        protocol: "https",
        hostname: "images.unsplash.com",
      },
    ],
  },

  // Habilitar PPR(Partial Prerendering)
  experimental: {
    ppr: true,
  },
};

export default nextConfig;

Saída:

TEXT 📖 Somente leitura
O componente renderiza sua UI.

Saída:

TEXT 📖 Somente leitura
Depois que a configuração entrar em vigor:
1. Componentes <Image> podem carregar imagens de fakestoreapi.com e images.unsplash.com
2. Na página Suspense O conteúdo após o limite usará Renderização Streaming PPR
3. Execute Novamente npm run dev A configuração entrará em vigor depois


5. Servidores de Desenvolvimento e Turbopack

(1) Iniciar o servidor de desenvolvimento

BASH
# Ir para o diretório do projeto
cd shophub

# Iniciar o servidor de desenvolvimento
npm run dev

▶ Exemplo: Experiência de Hot Reload ao Vivo Turbopack

Saída:

TEXT 📖 Somente leitura
  ▲ Next.js 16.0.0
  - Local:        http://localhost:3000
  - Environments: .env.local

 ✓ Starting...
 ✓ Ready in 1.2s
BASH
# ============================================
---
# Iniciar o servidor de desenvolvimento, Observação Turbopack Na velocidade máxima HMR
---
# ============================================

npm run dev

# Saída do Console
> shophub@0.1.0 dev
> next dev

  ▲  ▲
  ▲  Next.js 16.2
  ▲  - Local: http://localhost:3000
  ▲  - Turbopack: ✓ loaded in 742ms

✔ Compiled /src/app/page.tsx in 142ms (modules: 523)

Agora edite src/app/page.tsx para mudar qualquer texto, depois salve:

TEXT 📖 Somente leitura
✔ Updated /src/app/page.tsx in 4ms    ← 4 milissegundos! Atualiza quase instantaneamente

Saída:

TEXT 📖 Somente leitura
  ▲ Next.js 16.2
  - Local: http://localhost:3000
  - Turbopack: ✓ loaded in 742ms

✔ Compiled /src/app/page.tsx in 142ms (modules: 523)
✔ Updated /src/app/page.tsx in 4ms    ← 4 milissegundos! Atualiza quase instantaneamente

Comparado ao Webpack:

Operação Webpack (v15) Turbopack (v16) Melhoria de Desempenho
Cold Start 5–10 s 0.7–1.2 s 8x
Hot reload de arquivo único 50–200 ms 2–10 ms 20x
Builds de Projetos Grandes Linha de base 10x Mais Rápido 10x

(2) npm run build Build de Produção

BASH
# Construir a versão de produção
npm run build

Saída:

TEXT 📖 Somente leitura
✓ Linting and checking validity of types
✓ Collecting page data
✓ Generating static pages (5/5)
✓ Collecting build traces
✓ Finalizing page optimization

Route (app)                              Size     First Load JS
┌ ○ /                                    5.1 kB          89 kB
├ ○ /_not-found                          152 B          84.1 kB
└ λ /api/hello                           0 B            84.1 kB
+ First Load JS shared by all            84.1 kB
  ├ chunks/main-app                      ...
  └ chunks/webpack                       ...

○  (Static)  Geração Estática(SSG)
λ  (Dynamic) Renderização Dinâmica(SSR)

▶ Exemplo: "npm run build" exibe o tipo de rota

Saída:

TEXT 📖 Somente leitura
(Veja saída acima)
BASH
# ============================================
---
# Interpretando a Saída do Build de Produção
---
# ============================================

# Suponha que duas páginas foram criadas:
---
# app/about/page.tsx e app/dashboard/page.tsx
---
# Entre eles dashboard Usado cookies() Funções Dinâmicas

npm run build

# Significado dos Símbolos na Saída:
○  /              # Página Estática(Sem funções dinâmicas)
○  /about         # Página Estática
λ  /dashboard     # Páginas Dinâmicas(Usou API dinâmica)
○  /_not-found    # Página 404

Saída:

TEXT 📖 Somente leitura
Route (app)                              Size     First Load JS
┌ ○ /                                    5.1 kB          89 kB
├ ○ /about                               3.2 kB          87 kB
├ λ /dashboard                           6.8 kB          92 kB
└ ○ /_not-found                          152 B          84.1 kB

Saída:

TEXT 📖 Somente leitura
Route (app)                              Size     First Load JS
┌ ○ /                                    5.1 kB          89 kB
├ ○ /about                               3.2 kB          87 kB
├ λ /dashboard                           6.8 kB          92 kB
└ ○ /_not-found                          152 B          84.1 kB

○  (Static)  Geração Estática(SSG)
λ  (Dynamic) Renderização Dinâmica(SSR)

(3) npm start Servidor de Produção

BASH
# Iniciar o servidor de produção após o deploy
npm run build
npm start
💡 Dica: npm start deve ser executado após npm run build; ele lança a versão de produção otimizada, não a versão de desenvolvimento.



6. Entendendo os Scripts em package.json

(1) Lista de Scripts Padrão

JSON
{
  "name": "shophub",
  "version": "0.1.0",
  "private": true,
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint"
  },
  "dependencies": {
    "next": "^16.2.0",
    "react": "^19.0.0",
    "react-dom": "^19.0.0"
  },
  "devDependencies": {
    "@types/node": "^22.0.0",
    "@types/react": "^19.0.0",
    "@types/react-dom": "^19.0.0",
    "typescript": "^5.7.0",
    "tailwindcss": "^4.0.0",
    "eslint": "^9.0.0",
    "@eslint/eslintrc": "^3.0.0"
  }
}
Script Comando Finalidade
npm run dev next dev Iniciar o servidor de desenvolvimento (Turbopack)
npm run build next build Build de Produção
npm start next start Iniciar Servidor de Produção
npm run lint next lint Verificação de Estilo de Código

▶ Exemplo: Adicionando um Script Personalizado

Saída:

TEXT 📖 Somente leitura
Estrutura JSON com scripts (dev, build, start, lint, type-check, format, preview) e seus comandos CLI correspondentes.
JSON
// ============================================
// Adicionar scripts personalizados comumente usados em package.json
// ============================================

{
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint",
    "type-check": "tsc --noEmit",
    "format": "prettier --write .",
    "preview": "npm run build && npm start"
  }
}

Saída:

TEXT 📖 Somente leitura
npm run type-check   → Executar Verificação de Tipo TypeScript(Não gera arquivo)
npm run format       → Formatar todo o código com Prettier
npm run preview      → Construir primeiro, depois iniciar o servidor de produção(Feito com um único comando)

Saída:

TEXT 📖 Somente leitura
npm run type-check   → Executar Verificação de Tipo TypeScript (sem gerar arquivos)
npm run format       → Formatar todo o código com Prettier
npm run preview      → Construir primeiro, depois iniciar o servidor de produção (comando único)


7. Extensões VS Code Recomendadas

(1) Plugins Principais

Nome do Plugin Finalidade Número de Instalações
Tailwind CSS IntelliSense Autocompletar nomes de classe Tailwind + pré-visualização hover 10M+
ES7+ React/Redux/React-Native snippets Snippets JSX (rafce → template de componente) 8M+
Prettier - Code Formatter Formatação automática de código 40M+
Error Lens Mensagens de erro inline 5M+
GitLens Visualização de Histórico Git 15M+

8. Exemplo Completo: Construindo um Projeto TaskFlow do Zero

BASH
# ============================================
---
# Exemplo Abrangente: Construir um Sistema Completo do Zero Next.js 16 Projeto
---
# TaskFlow — Plataforma de Gerenciamento de Colaboração de Projetos
---
# ============================================

# 1. Criar um Projeto
npx create-next-app@latest taskflow ^
  --typescript ^
  --eslint ^
  --tailwind ^
  --src-dir ^
  --app ^
  --import-alias "@/*"

# 2. Ir para o diretório do projeto
cd taskflow

# 3. Ver Estrutura de Diretórios
tree . /F | findstr /r "^.*src" > nul && dir /s /b src

# 4. Iniciar o servidor de desenvolvimento
npm run dev

# 5. Em outro terminal, Adicionar Layout VS Code Recomendado
mkdir .vscode
JSON
// .vscode/settings.json — Configuração de Nível de Projeto
{
  "editor.formatOnSave": true,
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.codeActionsOnSave": {
    "source.fixAll.eslint": "explicit"
  },
  "typescript.preferences.importModuleSpecifier": "non-relative"
}
TSX
// src/app/page.tsx — Mudar a página inicial para Página de Boas-Vindas TaskFlow
import Link from "next/link";

export default function Home() {
  return (
    <div className="min-h-screen bg-gradient-to-br from-blue-50 to-indigo-100">
      <div className="container mx-auto px-4 py-16 text-center">
        <h1 className="text-5xl font-bold text-gray-900 mb-4">
          TaskFlow
        </h1>
        <p className="text-xl text-gray-600 mb-8 max-w-2xl mx-auto">
          A collaborative project management platform built with Next.js 16.
          Plan, track, and deliver projects together.
        </p>
        <div className="flex gap-4 justify-center">
          <Link
            href="/login"
            className="px-6 py-3 bg-blue-600 text-white rounded-lg hover:bg-blue-700"
          >
            Get Started
          </Link>
          <Link
            href="/about"
            className="px-6 py-3 border border-gray-300 rounded-lg hover:bg-gray-50"
          >
            Learn More
          </Link>
        </div>
        <div className="mt-16 grid grid-cols-3 gap-8 max-w-3xl mx-auto">
          <div className="p-6 bg-white rounded-xl shadow-sm">
            <h3 className="font-bold text-lg">Plan</h3>
            <p className="text-gray-500 mt-2">Create projects and assign tasks</p>
          </div>
          <div className="p-6 bg-white rounded-xl shadow-sm">
            <h3 className="font-bold text-lg">Track</h3>
            <p className="text-gray-500 mt-2">Monitor progress in real-time</p>
          </div>
          <div className="p-6 bg-white rounded-xl shadow-sm">
            <h3 className="font-bold text-lg">Deliver</h3>
            <p className="text-gray-500 mt-2">Ship projects on schedule</p>
          </div>
        </div>
      </div>
    </div>
  );
}

Saída Esperada:

TEXT 📖 Somente leitura
No navegador http://localhost:3000 Veja:

[Título TaskFlow]
A collaborative project management platform built with Next.js 16.
Plan, track, and deliver projects together.

[Get Started] [Learn More]

┌──────┐  ┌──────┐  ┌──────┐
│ Plan │  │ Track│  │Deliver│
└──────┘  └──────┘  └──────┘

❓ Perguntas Frequentes

P: create-next-app Preciso incluir parâmetros como --ts --tailwind? R: Não, você não precisa. Se você não incluir nenhum parâmetro, entrará no modo de perguntas e respostas interativo e solicitará cada opção uma por uma. O modo de parâmetro é adequado para automação CI/CD. Ambos os métodos produzem os mesmos resultados.

P: src/ Quais são os benefícios de usar uma estrutura de diretórios? É obrigatório? R: src/ Uma estrutura de diretórios separa o código da aplicação (src/) dos arquivos de configuração (diretório raiz), tornando a estrutura do projeto mais clara. Não é obrigatório, mas este tutorial recomenda usar um. Você também pode optar por não usar, caso em que o diretório app/ é colocado diretamente no diretório raiz.

P: Por que o navegador não atualiza automaticamente depois que eu mudo o código? R: Verifique se você está usando npm run dev (modo de desenvolvimento). Se você está usando npm start, esse é o servidor de produção; você precisará voltar para npm run build. Além disso, o Turbopack usa hot reloading por padrão em vez de atualização completa da página, então mudanças em estilos ou tags devem ter efeito imediato.

P: O Turbopack pode ser desabilitado? R: Sim. Defina experimental.turbopack: false em next.config.ts para voltar ao Webpack. No entanto, Next.js 16 recomenda oficialmente usar Turbopack, e o suporte ao Webpack pode ser removido em versões futuras.

P: .vscode/settings.json deve ser commitado no Git? R: É recomendado commitar. Contém configurações de formatação e qualidade de código para todo o projeto, garantindo que todos os membros da equipe—incluindo novos desenvolvedores—usem configurações consistentes. No entanto, .vscode/launch.json (configurações de debug) varia de pessoa para pessoa, então não precisam ser commitados.

P: O que significa o prefixo ^ antes do número da versão Next.js em package.json? R: ^16.2.0 indica que npm install pode instalar a versão menor mais recente dentro do intervalo 16.x.x (ex.: 16.3.0, 16.4.0), mas não atualizará para 17.0.0. ~16.2.0 permite apenas 16.2.x. Para bloquear a versão, use 16.2.0 sem o prefixo.


📖 Resumo


📝 Exercícios

  1. Exercício Básico (⭐): Use create-next-app para criar um novo projeto chamado my-next-app (com TypeScript, Tailwind e App Router habilitados), inicie o servidor de desenvolvimento, abra localhost:3000 no seu navegador e tire uma captura de tela da página inicial.

  2. Exercício Avançado (⭐⭐): Configure remotePatterns em next.config.ts para permitir carregar imagens de images.unsplash.com, depois use o componente <Image> em app/page.tsx para carregar uma imagem Unsplash (largura 800, altura 600).

  3. Desafio (⭐⭐⭐): Crie duas páginas, app/about/page.tsx e app/contact/page.tsx; configure .vscode/settings.json para formatar automaticamente ao salvar; execute npm run build para ver os símbolos e λ na saída; e interprete o tipo de cada rota.

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%