Lição 1 de 9: Do local ao deployável
- Arquivo
.env.exampleno repo, com todas as variáveis que produção vai precisar (sem valores) npm run buildrodando verde local (não sónpm run dev)vercel build(dry-run) rodando local sem erros- Commit
chore(deploy): env.example + build green local
O que muda de local pra produção
Fatia 1 está rodando local (Módulo 3 inteiro). A próxima fronteira é produção, onde o ambiente muda em quatro pontos: otimizado em vez de npm run dev, variáveis vindas do ambiente em vez de .env.local, banco que não é o seu, e comportamento que pode divergir do dev em 3 lugares previsíveis.
Você vai preparar o repo pra subir (o em si fica pra L02), mas não vai subir ainda. Cada ambiente é uma fronteira diferente:
localhost:3000: npm run dev. Hot reload, sem build, env do .env.local. Onde você esteve até agora.npm run build local: versão otimizada rodando na sua máquina. Pega 80% dos erros que iriam quebrar em produção.vercel build (): simula o build do Vercel local. Pega config-specific bugs antes de qualquer URL pública existir.preview-xxx.vercel.app + produção: só na L02. Aqui na L01 você prepara; a fronteira pública vem depois.A regra: rodar npm run build local até passar verde, com .env.example completo, é o sinal de que produção tem condição de funcionar.
As 3 divergências entre dev e produção
Três divergências previsíveis entre dev e prod no Next.js + Vercel:
- Server Components com
process.envque existem só no.env.local. Em dev, Next lê.env.localautomático. Em prod, ele lê do environment do Vercel; se você esqueceu de configurar, o componente renderiza comundefinede quebra silenciosamente. - Imports dinâmicos que dev tolera.
import('./something')que dev resolve sem reclamar pode quebrar no build se o path estiver errado em maiúscula/minúscula (Linux do servidor Vercel é case-sensitive; macOS local é case-insensitive). - Console.log que dev mostra colorido. Em prod, vira linha JSON nos logs do Vercel; se você usa
console.logpra debugar, vira ruído sem contexto. Esta lição ainda não trata isso (M3/L06 instalou oanalytics.track); mas é bom saber.
A consequência prática: você quer descobrir essas três classes agora (build local), não dali a 5 minutos quando o site público quebrar.
Passo 1 — Catalogue as variáveis de ambiente
Cole no Claude:
Lê todos os arquivos do projeto que usam `process.env` ou `import.meta.env` (Next.js: process.env; Vite: import.meta.env). Lista pra mim:
1. Cada variável de ambiente usada (sem o valor — só o nome)
2. Onde ela é usada (path do arquivo)
3. O que acontece se ela estiver `undefined` (crash imediato? fallback silencioso? erro de tipo?)
Resposta em tabela markdown.Aprove e leia a resposta com atenção. As variáveis com "fallback silencioso" são as perigosas: em produção, vão funcionar errado sem avisar.
Passo 2 — Crie .env.example
Cole no Claude:
Crie `.env.example` na raiz do projeto. Inclui:
1. Cada variável de ambiente identificada no Passo 1, com:
- Nome em UPPER_SNAKE_CASE
- Comentário em pt-BR explicando o que é (1 linha)
- Valor de exemplo (placeholder, nunca o valor real). Use `<<gere-com-comando-X>>` quando for segredo, ou exemplo formatado quando for URL.
2. **Não copie do `.env.local`** — gere a partir dos nomes catalogados. Se algum nome do `.env.local` não aparece no código, ignora (variável morta) e me avisa no fim.
Mostre o diff antes de criar. Confirma que `.env.example` está no `.gitignore` NEGADO (forçando entrar no git, ao contrário do `.env*`).Aprove. Verifica que .gitignore permite .env.example (pode precisar de !.env.example se a regra geral é .env*).
Passo 3 — npm run build local até passar
Roda:
Rode `npm run build` no projeto. Mostre o output completo. Se passar verde, ótimo. Se falhar, mostra exatamente qual erro e onde, e propõe correção sem aplicar — quero ver antes.3 classes comuns de erro:
- Erro de tipo (
tsc). Provavelmente umanyimplícito que dev tolerava. Conserta sem// @ts-ignore: o jeito honesto é tipar corretamente. - Erro de import (case mismatch).
import Foo from './foo'quando o arquivo éFoo.tsxquebra no Linux do Vercel. Conserta o path pra bater exatamente com o nome do arquivo. - Erro de env var (
undefined). Significa quenpm run buildprecisa de uma variável que.env.localtem mas.env.examplelista. Confirma se ela é build-time ou runtime. Se for build-time (process.env.NEXT_PUBLIC_*), precisa estar disponível durante o build no Vercel.
Depois de corrigir, roda de novo. Não avance enquanto não passar verde.
Passo 4 — vercel build (dry-run)
Esta etapa simula o build do Vercel localmente. Pega erros que npm run build não pega (config do Vercel, runtime do serverless, etc.).
Verifica se a Vercel CLI está instalada (`vercel --version`). Se não, propõe instalar com `npm i -g vercel` e me avisa antes. Se sim, roda `vercel build` no projeto (sem `--prod`, é dry-run) e mostra o output. Não roda `vercel deploy` ainda — só o build.Se passa, o repo está pronto pra subir. Se falha, é configuração específica do Vercel (geralmente vercel.json ou next.config): Claude propõe correção, você revisa.
Passo 5 — Faça o commit
Faça commit do `.env.example` + correções de build que foram aplicadas. Mensagem: `chore(deploy): env.example + build green local`. Mostra os comandos antes.Aprove. Confira no GitHub. Não suba pra Vercel ainda: a L02 é a lição do primeiro deploy real.
Build Diary — um checklist pré-deploy real
Um projeto real tinha um launch-readiness.md: auditoria sistemática de cada aba do produto antes do lançamento público. Cinco workstreams paralelos, cada um com Acceptance criteria explícitos:
Workstream 4 — Session persistence parity. Make cross-device restore work for every tool, not just Analyze.
Acceptance criteria:
- All tool outputs are user-keyed (not profileId-keyed) so they survive cross-device login
- Migration runs idempotently for users who already have profileId-keyed entries
- Tests pass; no regression in single-device flow
Cada item de cada workstream tem assertion programática: não "espero que funcione," mas "se este check falhar, deploy é bloqueado." Esse é o pattern que esta lição instala em escala mínima.
Rodar o build de produção uma vez antes do deploy é o que evita descobrir erro em público. O build local pega a maior parte dos erros antes de qualquer URL pública existir: erro de tipo que dev silencia, import case-sensitive que macOS tolera mas Linux rejeita, env var que ficou faltando.
Takeaways
- Produção muda quatro coisas em relação ao local: build otimizado, env vars de ambiente, banco separado, e divergências previsíveis em case-sensitivity e fallback silencioso de
process.env. .env.exampleno git, valores reais nunca..env.localno.gitignoresempre.npm run buildlocal antes de qualquervercel deploy: pega 80% dos erros que apareceriam em produção.vercel build(dry-run) é a camada final antes do deploy real: pega config-specific bugs do Vercel.
Você terminou quando
Quatro coisas:
.env.exampleno repo com todas as variáveis catalogadas (placeholders, nunca valores reais)npm run buildpassa verde localvercel build(dry-run) passa local- Tudo commitado