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
- Criar um projeto usando o scaffolding
create-next-app - Entender diretórios e arquivos principais como
app/,public/,next.config.js, etc. - Iniciar o servidor de desenvolvimento e experimentar as atualizações instantâneas do Turbopack
- Analisar os Scripts Principais em
package.json - Configurar as extensões de desenvolvimento recomendadas para VS Code
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óriosrc/? 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-apppara gerar uma estrutura de projeto com boas práticas com um único clique.
# 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
# Executar o comando de scaffolding
npx create-next-app@latest
Você verá as seguintes opções interativas:
? 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)
# 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
# ============================================
---
# 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:
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
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:
Diagrama: shophub/; src/; public/; Outros Arquivos de Configuração; app/; app/globals.css.
// ============================================
// 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:
Renderiza: Componente Home com elementos UI descritos.
Saída:
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
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 /:
// 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:
TypeScript compilado.
// ============================================
// 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:
O componente renderiza sua UI.
Saída:
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
# 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:
▲ Next.js 16.0.0
- Local: http://localhost:3000
- Environments: .env.local
✓ Starting...
✓ Ready in 1.2s
# ============================================
---
# 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:
✔ Updated /src/app/page.tsx in 4ms ← 4 milissegundos! Atualiza quase instantaneamente
Saída:
▲ 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
# Construir a versão de produção
npm run build
Saída:
✓ 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:
(Veja saída acima)
# ============================================
---
# 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:
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:
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
# Iniciar o servidor de produção após o deploy
npm run build
npm start
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
{
"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:
Estrutura JSON com scripts (dev, build, start, lint, type-check, format, preview) e seus comandos CLI correspondentes.
// ============================================
// 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:
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:
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
# ============================================
---
# 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
// .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"
}
// 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:
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-appPreciso 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órioapp/é 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á usandonpm start, esse é o servidor de produção; você precisará voltar paranpm 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: falseem 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.jsondeve 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 empackage.json? R:^16.2.0indica quenpm installpode 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.0permite apenas 16.2.x. Para bloquear a versão, use16.2.0sem o prefixo.
📖 Resumo
create-next-appé a ferramenta de scaffolding oficial; você pode criar um projeto com boas práticas com um único comando- Configuração recomendada: TypeScript + ESLint + Tailwind + App Router + diretório src/
src/app/armazena páginas de rota;public/armazena recursos estáticosnext.config.tsé o arquivo de configuração principal (domínio de imagem, toggle PPR, etc.)npm run devUsando Turbopack para hot reloading é 10 a 50 vezes mais rápido que Webpacknpm run build+npm starté o processo para configurar e iniciar o ambiente de produção- Extensões VS Code recomendadas: Tailwind CSS IntelliSense, ES7+ React snippets, Prettier
npm run devé apenas para desenvolvimento;npm startdeve ser construído antes do uso
📝 Exercícios
-
Exercício Básico (⭐): Use
create-next-apppara criar um novo projeto chamadomy-next-app(com TypeScript, Tailwind e App Router habilitados), inicie o servidor de desenvolvimento, abralocalhost:3000no seu navegador e tire uma captura de tela da página inicial. -
Exercício Avançado (⭐⭐): Configure
remotePatternsemnext.config.tspara permitir carregar imagens deimages.unsplash.com, depois use o componente<Image>emapp/page.tsxpara carregar uma imagem Unsplash (largura 800, altura 600). -
Desafio (⭐⭐⭐): Crie duas páginas,
app/about/page.tsxeapp/contact/page.tsx; configure.vscode/settings.jsonpara formatar automaticamente ao salvar; executenpm run buildpara ver os símbolos○eλna saída; e interprete o tipo de cada rota.