Nível 2Unidade 1 · Web estática3 aulas de 50 min + 1 h EAD
Aula 01 — Apresentação, arquitetura web, ambiente de desenvolvimento e Git
Nível 2 — Desenvolvimento Web · WebLab
Esta é a primeira aula do Nível 2. Ao final dela você terá um repositório Git publicado na internet, o ambiente de trabalho do semestre inteiro montado e uma ideia clara de onde o Nível 2 vai chegar: uma aplicação full-stack com API própria, login do Google e CRUD persistido.
No Nível 1 você aprendeu a escrever HTML semântico, estilizar com CSS (layout, responsividade, animações) e programar o comportamento das páginas com JavaScript (variáveis, funções, eventos, validação de formulários). Hoje o Nível 2 pega esse repertório e o coloca dentro de um processo profissional: ambiente configurado, código versionado, projeto publicado. Nas próximas 16 aulas esse mesmo projeto vai crescer até virar uma aplicação com servidor próprio.
Checklist para começar:
[ ] Um notebook (ou uma máquina do laboratório) com Google Chrome ou Firefox atualizado.
[ ] Permissão para instalar programas na máquina — ou, no laboratório, saber que as instalações se perdem no reboot (a §7.5 resolve isso).
[ ] Uma conta de e-mail que você realmente acessa (vai virar sua conta do GitHub).
[ ] Uma ideia, mesmo vaga, de tema para o seu projeto autoral (§1.5). Você decide hoje ou até a próxima aula.
Você não precisa saber Git, terminal ou Node.js. Tudo isso começa do zero hoje.
O que esta trilha cobre (a mesma ementa da disciplina em que esta trilha nasceu, Desenvolvimento Web): arquitetura de uma aplicação web; tecnologias de back-end; tecnologias de front-end; bancos de dados para web.
Objetivo geral: ao concluir esta trilha você projeta, implementa e publica uma aplicação web completa — interface acessível e responsiva, comportamento dinâmico em JavaScript, API própria em Node.js/Express, autenticação com conta Google e operações de CRUD com persistência.
A palavra que resume o Nível 2 é profundidade. No Nível 1 você aprendeu as três linguagens da plataforma. Aqui você aprende a arquitetura em que elas vivem: como um site é servido, como duas máquinas conversam por HTTP, como o código sai da sua pasta e vai parar em um endereço público, e como o servidor deixa de ser um mistério e passa a ser código seu.
Apresentação; arquitetura web; ambiente de desenvolvimento e Git
02
Introdução ao desenvolvimento web moderno
03
Revisão de HTML: layout, links e formulários
04
Frameworks CSS
05
Animação e SVG
06
Acessibilidade e ARIA
07
Revisão de JavaScript: objetos, funções, eventos e DOM
08
Funções, arrow functions, callbacks e vetores
09
Promises e async/await
10
AJAX, JSON e Single Page Application
11
Introdução ao Express
12
Express estruturado e middlewares
13
Rotas e controladores
14
Autenticação com Google (front e back)
15
CRUD com front-end assíncrono (AJAX/SPA)
16
CRUD completo com autenticação Google
O conteúdo abaixo é o mesmo em qualquer turma ou semestre, e serve igualmente a quem estuda por conta própria, sem vínculo com nenhuma turma.
⚠️ Atenção
Se você depende da rede do laboratório para subir seu trabalho, não deixe para o último minuto: ela tende a cair justamente quando mais gente está enviando ao mesmo tempo. Rode git push assim que terminar cada parte, não só no fim da aula.
Website client-side em HTML e CSS: HTML semântico, layout responsivo, framework CSS, animação/SVG, acessibilidade.
2
Evolução do site com JavaScript: validação de formulários, DOM e eventos, programação assíncrona, SPA com AJAX/JSON.
3
Aplicação full-stack com Node.js e Express: rotas e controladores, autenticação Google, CRUD com persistência, front-end assíncrono.
Os três marcos são individuais, práticos e recaem sobre o mesmo projeto autoral. Cada um vive no mesmo repositório público do GitHub — não .zip, não pasta no Drive, não print de tela. O repositório é o produto, e o histórico de commits faz parte dele.
Esta trilha soma cerca de 60 h de estudo: aproximadamente 45 h acompanhando as 16 aulas — a construção guiada do projeto fio-condutor — e 15 h de prática independente ligada ao projeto autoral, em atividades de cerca de 1 h por aula.
⚠️ Atenção
A prática independente não é bônus: ela prepara direto o marco da unidade. Quem pula a atividade de uma aula chega na seguinte sem o pré-requisito, porque cada aula assume que a anterior foi concluída.
O projeto fio-condutor é o Café Cerrado, construído passo a passo ao longo das aulas. É uma cafeteria fictícia de Sinop/MT, que torra grãos do cerrado mato-grossense. Na Unidade 1 ela é um site estático publicado no GitHub Pages; na Unidade 2 ganha cardápio dinâmico, busca, filtros e navegação SPA; na Unidade 3 ganha uma API em Express, login com conta Google e um CRUD de produtos com persistência. Digite o código você mesmo — não copie e cole.
Em paralelo, você desenvolve um projeto autoral com a mesma arquitetura e um domínio diferente. Os marcos são sobre o projeto autoral.
Exemplos de temas que funcionam: catálogo de plantas do Pantanal, agenda de quadras esportivas, mural de estágios do curso, brechó, controle de pescarias no Teles Pires, loja de peças de bicicleta, biblioteca de uma escola, feira de produtores locais.
O critério para saber se um tema serve é objetivo: ele tem uma lista de coisas? Produtos, plantas, quadras, vagas, peças, livros. O semestre inteiro gira em torno de uma coleção de itens que é exibida, filtrada, criada, editada e apagada. Se o seu tema não tem uma lista clara, troque agora — e não na Unidade 3.
💡 Dica
Escolha um domínio sobre o qual você tenha conteúdo real: nomes, preços, descrições, fotos. O erro clássico é escolher "site de uma empresa" e travar na hora de escrever a terceira frase. Tema concreto gera projeto melhor — e mais fácil de defender quando alguém perguntar como funciona.
💻 Mão na massa — passo a passo guiado no Café Cerrado. Todo mundo faz junto, digitando (não colando).
🧪 Laboratório — exercícios práticos em três níveis: A (fixação), B (aplicação) e C (desafio para quem termina antes).
🏆 Desafios — extras opcionais, com estrelas de dificuldade: ⭐ (1–2 h), ⭐⭐ (uma tarde), ⭐⭐⭐ (um fim de semana). Não são obrigatórios, mas aprofundam a aula e ficam bem no portfólio.
🏠 Atividade assíncrona (1 h) — a tarefa da semana, ligada ao projeto autoral.
Uma rotina que funciona: leia os objetivos antes da aula; digite o código durante a aula; faça o Laboratório A no mesmo dia; faça o Nível B e a atividade assíncrona ao longo da semana; encare o Nível C e os Desafios se sobrar fôlego.
Toda entrega desta trilha é um link de repositório público no GitHub. Isso não é burocracia: é a forma como software é entregue no mercado. Um repositório bem cuidado — com README.md que explica o projeto, commits com mensagens legíveis e o site publicado — é a peça de portfólio mais barata que existe. Você vai terminar esta trilha com duas: o Café Cerrado e o seu projeto autoral.
A Web inteira funciona sobre um modelo de duas partes e uma regra:
Cliente: quem pede. Normalmente o navegador, mas também pode ser um aplicativo de celular, um script no terminal (curl), outro servidor ou — cada vez mais — um agente de IA.
Servidor: quem responde. Um programa que fica permanentemente escutando em uma porta, esperando requisições.
A regra: o cliente sempre inicia. Em HTTP clássico o servidor nunca manda nada de forma espontânea; ele só responde ao que foi pedido.
Na Unidade 3 você vai escrever o retângulo da direita. Até lá, ele é um serviço que outra pessoa mantém — o GitHub Pages, a partir de hoje.
2.2 O que acontece quando você digita um endereço¶
Esta sequência é uma das perguntas mais frequentes em entrevista técnica. Aprenda a narrá-la.
Passo 1 — Análise da URL. O navegador separa o endereço em partes (§3.4) e descobre qual protocolo usar e com quem falar.
Passo 2 — Resolução DNS. O nome cafecerrado.com.br não serve para roteamento; a rede trabalha com endereços IP. O navegador consulta o DNS (Domain Name System) para traduzir o nome em um IP, passando antes por caches: cache do navegador → cache do sistema operacional → arquivo hosts → servidor DNS do provedor.
Passo 3 — Conexão TCP. Com o IP em mãos, o navegador abre uma conexão TCP, normalmente na porta 80 (HTTP) ou 443 (HTTPS).
Passo 4 — Handshake TLS (só em HTTPS). Cliente e servidor negociam a criptografia, o servidor apresenta seu certificado digital e ambos combinam uma chave de sessão. É o que produz o cadeado na barra de endereço.
Passo 5 — Requisição HTTP. O navegador envia um texto (§3.1).
Passo 6 — Processamento no servidor. Se o recurso for um arquivo estático, o servidor apenas o lê do disco. Se for dinâmico, executa código, possivelmente consulta um banco e monta a resposta na hora.
Passo 7 — Resposta HTTP. Uma linha de status, cabeçalhos, uma linha em branco e o conteúdo.
Passo 8 — Renderização e sub-requisições. O navegador interpreta o HTML e dispara novas requisições para cada recurso referenciado: folhas de estilo, scripts, imagens, fontes. Cada uma repete os passos 5 a 7.
📌 Vale gravar
A ordem das oito etapas e o papel de cada uma. Os pontos mais cobrados: DNS traduz nome em IP (não "acha o site"); TLS é o que torna o HTTP seguro (HTTPS = HTTP + TLS); e uma única página dispara dezenas de requisições, não uma.
Abrir uma página comum dispara de 30 a 200 requisições. Isso muda a forma de pensar em desempenho: não adianta otimizar o HTML se a página baixa 4 MB de imagens e cinco fontes. Você vai medir isso na §7.6 e voltar ao tema na Aula 06, quando o Lighthouse entrar em cena.
HTTP (HyperText Transfer Protocol) é um protocolo de texto. Isso é uma decisão de projeto: qualquer pessoa consegue ler uma requisição sem ferramenta especial. Veja.
GET/cardapio.htmlHTTP/1.1Host:cafecerrado.exemplo.brUser-Agent:Mozilla/5.0 (X11; Linux x86_64) Chrome/139.0Accept:text/html,application/xhtml+xmlAccept-Language:pt-BR,pt;q=0.9Connection:keep-alive
A primeira linha diz o que se quer (GET), onde (/cardapio.html) e em qual versão do protocolo. As demais são cabeçalhos (headers): metadados no formato Nome: valor.
Três partes: linha de status (200 OK), cabeçalhos, e — depois de uma linha em branco — o corpo. Essa linha em branco é o que separa metadados de conteúdo. Guarde: na Unidade 3, quando você escrever res.status(201).json(produto) no Express, é exatamente esse texto que sai pela rede.
Atualizar um recurso existente (inteiro / parcialmente).
PUT /api/produtos/3
DELETE
Remover um recurso.
DELETE /api/produtos/3
Essas quatro operações são exatamente o CRUD (Create, Read, Update, Delete) que você vai implementar nas Aulas 13, 15 e 16. Repare que o método já diz a intenção: o caminho /api/produtos é o mesmo, o que muda é o verbo.
⚠️ AtençãoGET deve ser seguro: não pode alterar estado no servidor. Uma rota GET /apagar-produto/3 funciona tecnicamente e é um erro de projeto grave — buscadores, pré-carregadores do navegador e agentes de IA seguem links GET sozinhos, e apagariam seus produtos sem que ninguém clicasse em nada.
301 Moved Permanently, 302 Found, 304 Not Modified
4xx
Erro do cliente
400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found
5xx
Erro do servidor
500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable
Os que você mais vai usar (e devolver) ao longo desta trilha:
Código
Quando aparece
O que fazer
200 OK
Leitura bem-sucedida
Nada; é o caminho feliz
201 Created
Recurso criado por um POST
Devolver o recurso criado no corpo
400 Bad Request
Dados inválidos enviados pelo cliente
Explicar no corpo qual campo está errado
401 Unauthorized
Falta autenticação (Aula 14)
Cliente precisa fazer login
403 Forbidden
Autenticado, mas sem permissão (Aula 16)
Cliente está logado, mas o item é de outra pessoa
404 Not Found
Recurso inexistente
Verificar o caminho ou o id
500 Internal Server Error
Exceção não tratada no servidor
Ler o log do servidor: o erro é seu
💡 Dica
Mnemônico que resolve 90% das dúvidas: 4xx é culpa de quem pediu; 5xx é culpa de quem respondeu. Um 404 diz "você pediu algo que não existe". Um 500 diz "eu quebrei ao tentar responder".
Qual serviço na máquina (80 = HTTP, 443 = HTTPS; omitida quando é a padrão)
4
/cardapio/cafes
Caminho
Qual recurso dentro do servidor
5
?categoria=espresso&ordem=preco
Query string
Parâmetros chave=valor separados por &
6
#promocoes
Fragmento
Posição dentro da página. Nunca é enviado ao servidor
Dois desses elementos viram protagonistas mais adiante: a query string é como a busca do cardápio vai conversar com a API (GET /api/produtos?q=cafe, Aula 13), e o fragmento é o que faz a navegação SPA funcionar sem recarregar a página (#/cardapio, Aula 10). Guarde os dois.
HTTP é stateless: cada requisição é independente e o servidor, por si só, não lembra o que aconteceu na anterior. Isso parece uma limitação e é, na verdade, o que permitiu a Web escalar — qualquer servidor de um conjunto pode atender qualquer requisição.
Login, carrinho e sessão são construídos por cima disso: o cliente reenvia, a cada requisição, uma credencial (um cookie ou um token no cabeçalho Authorization). É exatamente o que você vai implementar na Aula 14, quando o Café Cerrado passar a exigir login do Google para escrever dados.
🔬 Investigue
Abra o site da sua universidade ou escola (ou outro site grande de sua preferência), pressione F12, vá à aba Network, marque Disable cache e recarregue com Ctrl+F5. Observe quatro coisas: (1) quantas linhas apareceram — cada uma é uma requisição completa dos passos 5 a 7 da §2.2; (2) a coluna Type (document, stylesheet, script, png, font); (3) clique na primeira linha, abra Headers e localize Content-Type, Server e o status; (4) na barra inferior, leia o total de requisições e o peso transferido. Anote os números: você vai comparar com os do seu próprio site no fim da aula.
Uma regra que vale para sempre: o navegador nunca fala com o banco de dados. Se ele falasse, qualquer usuário poderia ler e apagar tudo, porque todo código front-end é público — o usuário pode abrir o DevTools, ler seu JavaScript e alterar valores. Validação no cliente existe para conforto; validação no servidor existe para segurança. Você vai ver essa diferença doer na Aula 13.
⚠️ Atenção
"Dinâmico", em arquitetura, significa HTML montado no servidor. Uma página estática cheia de JavaScript, animações e busca continua sendo estática do ponto de vista arquitetural — é o caso do Café Cerrado até a Aula 10. É por isso que ele pode ficar hospedado de graça no GitHub Pages durante duas unidades inteiras.
Durante trinta anos a resposta era óbvia: do outro lado da requisição havia uma pessoa olhando uma tela. Isso mudou.
Relatórios de tráfego da web (Imperva/Thales, Cloudflare Radar) mostram que mais da metade do tráfego web já é gerada por máquinas — a primeira vez em uma década em que os bots ultrapassaram os humanos. O crescimento vem principalmente de agentes de IA: em 2025 o tráfego de bots de IA cresceu quase 190%, enquanto o tráfego humano cresceu cerca de 3%. O volume de rastreamento para treinar modelos chegou a várias vezes o volume de rastreamento dos buscadores tradicionais.
E essas máquinas já são clientes que pagam:
x402 (proposto pela Coinbase) ressuscitou o código de status HTTP 402 Payment Required, reservado desde os anos 90 e nunca usado de verdade. O agente faz uma requisição, recebe 402 com o preço, paga e refaz a requisição — sem checkout, sem cadastro, sem humano.
Redes de pagamento para agentes (Mastercard Agent Pay, Visa Trusted Agent Protocol, AP2 do Google) dão identidade e meio de pagamento a programas.
MCP (Model Context Protocol), aberto em 2024 e doado à Linux Foundation, padronizou a forma de conectar assistentes de IA a dados e ferramentas. Milhares de serviços já expõem "portas para agentes" em vez de telas para humanos.
🧠 Você sabia?
O código 402 Payment Required está na especificação do HTTP desde 1997 marcado como "reservado para uso futuro". Ficou quase três décadas sem uso prático — um número guardado à espera de um caso que só apareceu quando as máquinas viraram compradoras. Vale como lembrete de que o HTTP que você está aprendendo é um protocolo vivo: os mesmos verbos e os mesmos códigos de 1997 continuam sustentando o que se inventa hoje.
Por que isso importa para o que você vai construir aqui? Porque muda o que é "a fachada" de um sistema. O agente não quer o botão azul: ele quer o dado, em JSON, por uma API previsível e documentada. A interface humana continua importando — mas ela passa a ser uma das saídas, não a única.
A boa notícia é que tudo que você vai aprender aqui serve aos dois públicos. HTML semântico (Aula 03) é o que permite a uma máquina entender a estrutura da página. HTTP bem usado (§3) é o que torna a API previsível. JSON (Aula 10) é o formato que os dois lados falam. Express e rotas REST (Unidade 3) são a porta de entrada. Ninguém precisa mudar de assunto: precisa aprender o assunto direito.
A pergunta não é "pode usar IA?". Pode. A pergunta é "como usar bem?".
A favor de usar. Assistentes de código escrevem o repetitivo — estrutura inicial, testes, documentação, refatorações mecânicas — e liberam você para o que decide o resultado: arquitetura, modelagem de dados, experiência do usuário. Pesquisas de mercado apontam que a grande maioria dos desenvolvedores já usa algum assistente ao menos uma vez por mês, e que quem usa diariamente entrega bem mais mudanças por semana. Ficar de fora não é pureza técnica; é desvantagem competitiva.
Contra usar sem critério. Um estudo controlado da METR (2025) mediu desenvolvedores experientes trabalhando em bases de código que dominavam: quando usaram IA, ficaram em média 19% mais lentos — e ainda assim acharam que tinham ficado mais rápidos. Ferramenta sem domínio do problema atrapalha e dá a sensação contrária.
Então por que estudar HTTP, DOM e Express a fundo, se a IA escreve isso? Pelo mesmo motivo pelo qual você estuda Arquitetura de Computadores sem programar em Assembly no dia a dia: para entender o que acontece por baixo quando quebra. A IA escreve o código; quem julga se ele está correto, seguro e bem arquitetado é você. E só revisa bem quem entende a base.
Use IA como apoio, não como atalho: peça para ela explicar, não para resolver o que você ainda não entende. O teste real é simples — se você não consegue explicar uma linha do seu código, ela ainda não é sua.
💡 Dica
Um uso honesto e produtivo desde já: peça ao assistente para explicar um erro do terminal, não para "consertar o projeto". Cole a mensagem literal, pergunte o que ela significa e o que a causa. Você aprende a ler a mensagem — que é a habilidade que vai sobrar quando a ferramenta mudar de nome.
Sobre o Node.js: baixe sempre a versão marcada como LTS (Long Term Support). LTS significa suporte prolongado e estabilidade — é a versão que se usa em produção. Nesta trilha usamos o Node.js 22 LTS.
Instalar não basta: é preciso confirmar que o sistema encontra os programas. Abra um terminal (no VS Code, Ctrl+') e execute:
Terminal
node-v
npm-v
git--version
code--version
Saída esperada (os números podem variar um pouco):
Texto
v22.13.0
10.9.2
git version 2.43.0
1.96.2
Se algum comando responder command not found (Linux/macOS) ou não é reconhecido como um comando interno ou externo (Windows), o programa foi instalado mas não está no PATH — normalmente basta fechar e abrir o terminal de novo, porque o PATH só é lido na abertura. Se persistir, reinstale marcando a opção "adicionar ao PATH".
🔎 Por baixo do capôPATH é uma variável de ambiente com uma lista de pastas. Quando você digita node, o sistema não procura no computador inteiro: ele percorre essa lista, na ordem, procurando um executável com esse nome. É por isso que a instalação precisa "adicionar ao PATH" e por que o terminal aberto antes da instalação não enxerga o programa novo — ele guardou a lista antiga.
Instale-as com Ctrl+Shift+X. Depois, em File → Preferences → Settings, procure format on save e marque a opção: seu código passa a ser formatado a cada Ctrl+S. Isso elimina uma categoria inteira de discussão inútil sobre indentação — inclusive com você mesmo daqui a três semanas.
Regra permanente: no VS Code, use File → Open Folder e abra a pasta raiz do projeto. Nunca abra um .html solto. Live Server, caminhos relativos, terminal integrado e Git dependem de haver uma pasta raiz — e metade dos problemas de aula 1 vem de ignorar isso.
Isso é controle de versão manual — e ele falha em tudo o que importa: você não sabe o que mudou entre duas versões, nem por quê, nem quando, nem como voltar a um estado intermediário sem quebrar o resto.
O Git resolve isso registrando fotografias do projeto inteiro ao longo do tempo. Cada fotografia é um commit: o estado completo dos arquivos, mais autor, data e uma mensagem explicando a intenção. Com isso você consegue voltar no tempo, comparar duas versões linha a linha, descobrir quando um bug entrou e trabalhar com segurança porque nada se perde.
working directory staging area repositório
┌────────────────┐ add ┌───────────────┐ commit ┌──────────────┐
│ MODIFICADO │ ─────> │ PREPARADO │ ───────> │ VERSIONADO │
│ você editou │ │ vai entrar no │ │ histórico │
│ o arquivo │ │ próximo commit│ │ permanente │
└────────────────┘ └───────────────┘ └──────────────┘
A staging area (área de preparação) é o que confunde no começo e o que dá poder ao Git: ela deixa você escolher quais mudanças entram no próximo commit. Editou cinco arquivos mas só três formam uma mudança coerente? Prepare esses três, faça o commit, depois cuide do resto. Commits coerentes são o que torna o histórico legível.
8.3 Configuração inicial (uma única vez por máquina)¶
Terminal
gitconfig--globaluser.name"Seu Nome Completo"
gitconfig--globaluser.email"seu-email@exemplo.com"
gitconfig--globalinit.defaultBranchmain
gitconfig--globalcore.editor"code --wait"
Confira o que ficou gravado e de onde veio cada configuração:
Terminal
gitconfig--list--show-origin
⚠️ Atenção
Use o mesmo e-mail da sua conta do GitHub. É por ele que o GitHub associa os commits ao seu perfil. Com um e-mail diferente, seus commits aparecem como se fossem de um desconhecido — e, em uma entrega avaliada, isso vira dúvida sobre autoria.
# 1. transformar a pasta atual em um repositório Git
gitinit
# 2. ver o que mudou e em que estado está
gitstatus
# 3. preparar arquivos para o commit
gitaddindex.html# um arquivo específico
gitadd.# tudo que mudou na pasta atual e subpastas# 4. registrar a fotografia com uma mensagem descritiva
gitcommit-m"Cria a página inicial do Café Cerrado"# 5. ver o histórico
gitlog--oneline
Dois comandos que não estavam no roteiro clássico e que você vai usar muito:
Terminal
# ver exatamente o que mudou, linha a linha, antes de preparar
gitdiff
# descartar as alterações não preparadas de um arquivo
gitrestoreindex.html
git status é o comando mais importante da lista. Ele não só mostra o estado como sugere o comando seguinte. Quando estiver perdido, rode git status e leia com calma — a resposta costuma estar ali.
8.5 Mensagens de commit que servem para alguma coisa¶
Uma mensagem de commit responde à pergunta "o que este commit faz?". Escreva no imperativo, como se completasse a frase "Este commit…".
Ruim
Boa
alterações
Cria a estrutura inicial do site
aula 3
Adiciona formulário de contato com validação nativa
arrumei
Corrige quebra do menu em telas menores que 480px
.
Remove imagens não utilizadas da pasta img
Commits pequenos e frequentes valem mais do que um commit gigante no fim da semana. Regra prática: um commit por ideia concluída. Terminou o cabeçalho? Commit. Terminou o rodapé? Commit.
🔎 Por baixo do capô
Um commit não é "a diferença desde o anterior": é um instantâneo completo da árvore de arquivos, identificado por um hash (aquela sequência tipo a3f9c21) calculado a partir do conteúdo, do autor, da data, da mensagem e do commit anterior. Como o hash depende do commit anterior, alterar qualquer coisa no passado muda todos os hashes seguintes — é por isso que o histórico do Git é praticamente à prova de adulteração, e é por isso que git log conta uma história confiável.
Nem tudo deve entrar no repositório: arquivos gerados, dependências baixadas, configurações da sua máquina e — nunca esqueça — segredos. O arquivo .gitignore, na raiz do projeto, lista o que o Git deve ignorar:
Texto
# Sistema operacional
.DS_Store
Thumbs.db
# Editor
.vscode/
# Node.js (a partir da Unidade 3)
node_modules/
# Segredos: chaves e senhas nunca entram no repositório
.env
Duas dessas linhas evitam desastres reais. node_modules/ costuma ter dezenas de milhares de arquivos e é reconstruído com um npm install — versionar isso é entupir o repositório à toa. E .env é onde, na Aula 14, ficará o seu Client ID do Google: um arquivo desses vazado em repositório público é o tipo de erro que rende notícia.
O Git é a ferramenta; o GitHub é um serviço que hospeda repositórios Git na internet. Ele dá três coisas ao mesmo tempo: backup, portfólio público e o canal de entrega desta trilha.
Terminal
# conectar o repositório local ao remoto criado no GitHub
gitremoteaddoriginhttps://github.com/SEU-USUARIO/cafe-cerrado.git
gitbranch-Mmain
gitpush-uoriginmain
# nos próximos envios, basta:
gitpush
O que cada linha faz:
git remote add origin URL cadastra um apelido (origin) para o endereço do repositório remoto.
git branch -M main renomeia a branch atual para main, que é o nome padrão no GitHub.
git push -u origin main envia os commits e memoriza a associação; o -u é o que permite escrever só git push depois.
E, para trazer para a máquina um repositório que já existe (o caso de trocar de computador ou usar o laboratório):
💡 Dica
O GitHub não aceita mais senha da conta na linha de comando. Ao pedir autenticação, use um Personal Access Token (em Settings → Developer settings → Personal access tokens) no lugar da senha, ou configure uma chave SSH. No Windows, o Git Credential Manager instalado junto com o Git abre uma janela de login do navegador e resolve isso sozinho.
Todo repositório público do GitHub pode virar um site estático publicado, de graça:
No repositório, acesse Settings → Pages.
Em Source, escolha Deploy from a branch, a branch main e a pasta raiz (/ (root)).
Salve. Em alguns minutos o site estará em https://SEU-USUARIO.github.io/cafe-cerrado/.
A partir daí, cada git push republica o site automaticamente. Esse é o seu primeiro fluxo de deploy: você edita, commita, envia, e o mundo vê. Guarde a sensação — na Unidade 3 o mesmo raciocínio vale para uma API, com algumas camadas a mais.
💻 Mão na massa — o repositório cafe-cerrado no ar¶
Objetivo do bloco: sair da aula com o Café Cerrado publicado em um endereço público, versionado, com dois commits e um README.md decente.
Crie, em um lugar que você encontre depois (por exemplo Documentos/dev-web/), a pasta cafe-cerrado. Abra o VS Code e use File → Open Folder apontando para ela.
Texto
dev-web/
├── cafe-cerrado/ ← projeto fio-condutor (construído ao longo das aulas)
└── meu-projeto/ ← projeto autoral (tema seu, mesma arquitetura)
⚠️ Atenção
Nomes de arquivos e pastas em minúsculas, sem espaços, sem acentos, com hífen separando palavras: cafe-cerrado, nunca Café Cerrado. Servidores Linux — inclusive o do GitHub Pages — diferenciam maiúsculas de minúsculas, e o que funciona no seu Windows quebra ao publicar.
Crie o arquivo index.html na raiz da pasta. Digite (não cole):
cafe-cerrado/index.html
HTML
<!DOCTYPE html><htmllang="pt-BR"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>Café Cerrado — cafeteria em Sinop/MT</title></head><body><h1>Café Cerrado</h1><p>Cafeteria de grãos torrados do cerrado mato-grossense, em Sinop/MT.</p><p>Site em construção no Nível 2 do WebLab (Desenvolvimento Web).</p></body></html>
O nome index.html não é decorativo: é a convenção que todo servidor web segue para decidir o que entregar quando alguém pede a pasta em vez de um arquivo. Pedir https://exemplo.br/ entrega https://exemplo.br/index.html.
Abra a página com o Live Server (botão Go Live, canto inferior direito) e confirme que os acentos aparecem corretos. Leia a URL que abriu — algo como http://127.0.0.1:5500/index.html — com a §3.4 na cabeça: esquema http, host 127.0.0.1, porta 5500, caminho /index.html. Você acabou de subir um servidor web na sua própria máquina.
O README.md é a primeira coisa que o GitHub mostra a quem abre o repositório — e a primeira coisa que qualquer pessoa lê para decidir se vale a pena continuar explorando o projeto. Crie-o na raiz:
cafe-cerrado/README.md
Markdown
# Café Cerrado
Site da cafeteria fictícia **Café Cerrado** (Sinop/MT), construído aula a aula
no Nível 2 do WebLab (Desenvolvimento Web).
## O projeto
Uma cafeteria que torra grãos do cerrado mato-grossense. O site apresenta a
casa, o cardápio e um canal de contato. Ao longo do semestre ele evolui de
página estática para aplicação com API própria.
## Site publicado
https://SEU-USUARIO.github.io/cafe-cerrado/
## Tecnologias
HTML5 e CSS3. JavaScript entra na Unidade 2; Node.js e Express, na Unidade 3.
## Como executar localmente1. Clone o repositório.
2. Abra a pasta no VS Code.
3. Clique em "Go Live" (extensão Live Server).
## Autoria
Seu Nome — Desenvolvimento Web.
Troque SEU-USUARIO e Seu Nome pelos seus. O .md é Markdown, a mesma linguagem em que estas aulas são escritas: # faz título, **texto** deixa em negrito, - faz lista.
No terminal integrado do VS Code (Ctrl+'), confirme que você está na pasta certa e execute:
Terminal
gitinit
gitstatus
gitadd.
gitstatus
gitcommit-m"Cria a estrutura inicial do site do Cafe Cerrado"
gitlog--oneline
Rode git statusduas vezes, como está acima, e compare as saídas. Na primeira, os arquivos aparecem em vermelho sob Untracked files; na segunda, em verde sob Changes to be committed. Você acabou de ver a staging area da §8.2 funcionando.
A saída de git log --oneline deve ser parecida com:
Texto
7c1f4ab (HEAD -> main) Cria a estrutura inicial do site do Cafe Cerrado
Esse 7c1f4ab é o início do hash do commit. É o endereço permanente desta fotografia.
Não marque "Add a README file", "Add .gitignore" nem "Choose a license" — você já criou o que precisa localmente, e marcar essas opções cria commits no remoto que vão conflitar com os seus.
Clique em Create repository e copie a URL exibida.
Repita os passos 1 a 7 na pasta meu-projeto, com o seu tema: nome do projeto no <title> e no <h1>, um parágrafo dizendo o que é e para quem é, um README.md com o tema e as páginas que você pretende ter. Repositório público, GitHub Pages ligado.
A partir de hoje a regra é: o que o Café Cerrado ganha em aula, o seu projeto ganha em paralelo.
A4. Diga qual método HTTP e qual código de status você usaria em cada situação: (a) listar os produtos do cardápio; (b) cadastrar um produto novo com sucesso; (c) pedir um produto que não existe; (d) enviar um formulário com o campo preço em branco; (e) o servidor lançou uma exceção não tratada.
A5. O que significa dizer que o HTTP é stateless? Cite uma consequência prática disso para uma tela de login.
A6. Explique os três estados de um arquivo no Git e diga qual comando move o arquivo de um estado para o outro.
A7. Reescreva estas mensagens de commit no padrão da §8.5: alterações, aula 1, arrumei o css, commit final agora vai.
A8. Cite três tipos de arquivo que não devem entrar em um repositório e explique o porquê de cada um.
A9. Um site estático e uma aplicação dinâmica devolvem HTML para o navegador. Qual é, então, a diferença entre os dois? Classifique: SIGAA, cardápio do Café Cerrado na Unidade 1, portfólio pessoal, loja virtual.
A10. O que o comando git push -u origin main faz? Explique cada uma das quatro partes (push, -u, origin, main).
B1. Use a aba Network do DevTools para comparar três sites: um portal de notícias, um e-commerce e o seu https://SEU-USUARIO.github.io/cafe-cerrado/. Para cada um, registre: número de requisições, peso total transferido, tempo até o Load e qual foi o maior recurso. Escreva um parágrafo levantando hipóteses para as diferenças.
Resultado esperado: uma tabela com três linhas e quatro medidas, mais um parágrafo de análise (por exemplo, "o portal fez 4× mais requisições por causa de anúncios e rastreadores").
Dica
Marque Disable cache antes de medir, senão a segunda visita vem do cache e distorce tudo. A barra inferior da aba Network resume "N requests | X MB transferred | Finish: Y s". Para achar o maior recurso, clique no cabeçalho da coluna Size para ordenar.
B2. Plante e resolva um erro: no seu index.html publicado, apague a linha <meta charset="UTF-8">, faça commit e push. Espere o Pages republicar e abra o site. Descreva o que aconteceu com os acentos e explique por quê. Depois, desfaça — e faça o commit da correção com uma mensagem que descreva o conserto.
Resultado esperado: dois novos commits no histórico — o que quebra e o que conserta, ambos com mensagens claras — mais uma explicação de 3 a 5 linhas sobre o papel do charset na interpretação dos bytes.
Dica
Sem a declaração de charset, o navegador precisa adivinhar a codificação e frequentemente escolhe uma tabela de um byte por caractere, exibindo ç no lugar de ç. Para desfazer antes do commit, git restore index.html devolve o arquivo ao último estado versionado.
B3. Escreva o histórico de commits de uma tarefa real. Adicione ao index.html do Café Cerrado, em quatro etapas independentes, cada uma com seu próprio commit: (1) um parágrafo com o endereço da cafeteria; (2) um parágrafo com o horário de funcionamento; (3) um link mailto: para contato; (4) o ano de fundação. Ao final, rode git log --oneline e confira se o histórico conta a história sozinho.
Resultado esperado: quatro commits, um por mudança, com mensagens no imperativo; git log --oneline legível por alguém que não viu o código.
Dica
Use git add index.html e git commit depois de cada alteração, não no fim. Se você fizer as quatro e commitar uma vez só, refaça o exercício — o objetivo é justamente sentir a diferença de granularidade.
B4. Investigue o certificado HTTPS do seu site publicado. Clique no cadeado do navegador e registre: quem emitiu o certificado, para qual domínio ele é válido, até quando vale. Explique em três linhas o que o Passo 4 da §2.2 tem a ver com esses dados.
Resultado esperado: três dados anotados e uma explicação ligando certificado, autoridade certificadora e a chave de sessão negociada no handshake TLS.
Dica
No Chrome: cadeado → A conexão é segura → O certificado é válido. O emissor é a autoridade certificadora; é ela que garante ao navegador que o servidor é mesmo quem diz ser. Compare com o certificado de outro site grande de sua escolha (um banco, uma universidade, um grande portal de notícias).
B5. Escreva um README.md decente para o seu projeto autoral, com: título, um parágrafo explicando o tema e o público, a lista de páginas previstas, as tecnologias, como executar localmente e o link do site publicado. Commit e push.
Resultado esperado: o README.md renderizado na página inicial do repositório, com pelo menos quatro seções e nenhum trecho copiado do modelo do Café Cerrado sem adaptação.
Dica
O GitHub renderiza Markdown: # e ## para títulos, - para listas, **negrito**, e links no formato [texto](url). Prévia no VS Code: Ctrl+Shift+V.
C1. Recuperação de desastre. Simule a perda da máquina: apague (de verdade, ou renomeie) a pasta local cafe-cerrado, clone o repositório do GitHub em outro diretório, confirme que os dois commits estão lá, faça uma alteração no README.md, commite e envie. Depois, responda por escrito: o que exatamente foi recuperado no git clone — só os arquivos atuais, ou o histórico inteiro? Comprove sua resposta com a saída de um comando.
Dica
git clone traz a pasta .git inteira, e é ela que guarda o histórico. Comprove com git log --oneline dentro do clone: se os dois commits originais aparecem com os mesmos hashes, você recuperou o histórico, não apenas os arquivos.
C2. Meça o custo do HTTPS. No terminal, use curl para medir os tempos de uma requisição ao seu site publicado e a um site qualquer em HTTP simples, comparando o tempo de resolução DNS, de conexão TCP e de handshake TLS. Monte uma tabela com os três tempos para cada site e escreva um parágrafo sobre onde o tempo é gasto.
Dica
curl aceita um formato de saída com variáveis de tempo: experimente curl -o /dev/null -s -w "dns=%{time_namelookup} tcp=%{time_connect} tls=%{time_appconnect} total=%{time_total}\n" https://SEU-USUARIO.github.io/cafe-cerrado/. Rode duas vezes seguidas e observe o efeito do cache de DNS na segunda.
Um recrutador abre o seu GitHub e olha um repositório por, em média, alguns segundos. Nesse tempo ele decide se você sabe trabalhar ou se apenas entregou uma tarefa. A diferença raramente está no código: está no README.md, no histórico de commits e em haver (ou não) um link funcionando. Pegue o repositório do seu projeto autoral e transforme-o em uma peça de portfólio.
Critérios de pronto
README.md com: título, descrição do tema em um parágrafo, público-alvo, lista de páginas previstas, tecnologias, instruções para executar localmente e o link do site publicado, funcionando.
Pelo menos seis commits, todos com mensagens no imperativo, nenhuma com menos de três palavras, nenhuma genérica (alterações, update, aula).
.gitignore presente e adequado ao projeto.
A descrição curta do repositório (campo About, no topo da página do GitHub) preenchida, com o link do site publicado no campo Website.
Um parágrafo, entregue junto, explicando por que você organizou os commits daquela forma.
Pistas
Leia três README.md de projetos populares no GitHub e anote o que os três têm em comum.
O campo About fica no canto superior direito da página do repositório, na engrenagem ao lado do nome.
Se o seu histórico já estiver ruim, não apague nada: faça os próximos commits bem feitos e explique a virada no parágrafo final. Histórico é biografia, não maquiagem.
git log --oneline é o teste final: leia a saída em voz alta. Se ela conta a história do projeto, está pronto.
O navegador esconde tudo o que a §2.2 descreve. Hoje você faz o trabalho dele na mão: dispara requisições HTTP sem navegador, lê a resposta crua e mede onde o tempo é gasto. A ferramenta é o curl, que já vem no Windows 10+, no macOS e na maioria das distribuições Linux. Ao final você deve conseguir explicar cada uma das oito etapas com evidência na tela.
Critérios de pronto
A saída de curl -v https://SEU-USUARIO.github.io/cafe-cerrado/ salva em arquivo, com anotações marcando: resolução do nome, conexão TCP, handshake TLS (protocolo negociado e emissor do certificado), requisição enviada (linhas com >) e resposta recebida (linhas com <).
A saída de curl -I no mesmo endereço, com a explicação, em uma linha cada, de pelo menos cinco cabeçalhos de resposta.
Uma requisição a um caminho inexistente do seu site e a interpretação do status recebido, comparada com o que o navegador mostra na mesma situação.
Uma comparação entre curl --http1.1 -I e curl --http2 -I no mesmo endereço: qual versão o servidor aceitou e como você sabe.
Um texto de dez linhas ligando cada evidência ao passo correspondente da §2.2, escrito como se você fosse explicar o processo para outra pessoa que não acompanhou este trecho.
Pistas
curl --version confirma a instalação e lista os protocolos suportados (procure HTTP2 na linha Features).
Em -v, linhas com * são informações da conexão; > é o que foi enviado; < é o que voltou.
Se houver redirecionamento (301/302), acrescente -L para seguir e observe as duas respostas em sequência.
A primeira linha da resposta (HTTP/2 200 ou HTTP/1.1 200 OK) já denuncia a versão negociada.
Toda resposta HTTP carrega pistas sobre a infraestrutura que a produziu: qual software serviu, se passou por uma CDN, quanto tempo o arquivo pode ficar em cache. Vire detetive: escolha quatro sites (o da sua universidade ou escola, um jornal, um e-commerce e o seu site publicado) e descubra, só pelos cabeçalhos e por consultas de DNS, como cada um é entregue.
Critérios de pronto
Para cada site, uma tabela com Server, Content-Type, Cache-Control e pelo menos um cabeçalho que revele CDN (cf-ray, x-served-by, via, x-cache).
A classificação de cada site em "servido direto" ou "servido via CDN", com a evidência que sustenta a conclusão.
O resultado de nslookup (ou dig) para cada domínio, com o IP resolvido, e uma observação sobre quantos IPs cada nome devolve.
Uma linha por site explicando o que o valor de Cache-Control significa na prática para quem visita a página duas vezes.
Uma conclusão de cinco linhas sobre por que sites grandes usam CDN.
Pistas
Aba Network → clique na primeira linha (o documento) → Headers → role até Response Headers.
Server ausente também é resposta: alguns sites escondem o software de propósito, por segurança.
Um nome que devolve vários IPs geralmente está atrás de balanceamento ou de uma CDN — compare os IPs consultando de redes diferentes (celular e Wi-Fi).
O valor real do Git não aparece quando tudo dá certo — aparece às 23h30 do dia da entrega, quando você apaga o arquivo errado. Este desafio é um treino de emergência: você vai quebrar o próprio projeto de quatro formas diferentes e recuperá-lo de quatro formas diferentes, documentando cada uma.
Critérios de pronto
Cenário 1: você editou um arquivo e quer descartar a edição antes de preparar. Recupere e documente o comando.
Cenário 2: você já rodou git add e quer tirar o arquivo da staging area sem perder a edição. Recupere e documente.
Cenário 3: você commitou uma mudança ruim que já foi enviada com push. Desfaça criando um commit que reverte, sem reescrever o histórico público, e explique por que reescrever seria pior.
Cenário 4: você apagou um arquivo há três commits e só percebeu agora. Encontre o commit em que ele existia e traga o arquivo de volta.
Um documento docs/git-socorro.md no seu repositório, com os quatro cenários, o comando de cada um, a saída obtida e uma frase explicando o que o comando faz.
Bônus: um quinto cenário com git switch -c — você começou a trabalhar em uma ideia arriscada e quer isolá-la em uma branch, sem sujar a main.
Pistas
Comece por git status: em quase todos os cenários ele sugere o comando certo na própria saída.
Para o cenário 3, procure na documentação a diferença entre git revert e git reset. Só um dos dois é seguro para histórico já publicado.
Para o cenário 4, git log --oneline -- caminho/do/arquivo lista só os commits que tocaram naquele arquivo; git checkout <hash> -- caminho/do/arquivo traz uma versão antiga de volta para a working directory.
O livro Pro Git tem um capítulo inteiro chamado "Desfazendo Coisas", em português, gratuito em https://git-scm.com/book/pt-br.
Parte 1 — Ambiente (20 min). Instale, na sua máquina pessoal, VS Code, Node.js 22 LTS e Git. Rode os quatro comandos de verificação da §7.2 e tire uma captura de tela do terminal com as quatro saídas visíveis.
Parte 2 — Projeto autoral (30 min). Crie o repositório público do seu projeto autoral no GitHub, seguindo os passos 1 a 7 do Mão na massa com o seu tema:
index.html com a estrutura mínima, <title>, <h1> e dois parágrafos apresentando o tema.
README.md no formato do exercício B5.
.gitignore.
Pelo menos dois commits com mensagens no imperativo.
GitHub Pages ligado e o site abrindo.
Parte 3 — Leitura dirigida (10 min). Se você tem acesso a uma biblioteca virtual pela sua instituição: QUEIRÓS & PORTELA, capítulo introdutório sobre a evolução e a arquitetura da Web; PUREWAL, capítulo 1, sobre o fluxo de trabalho do desenvolvedor (editor, terminal e Git). Anote duas ideias de cada texto que não apareceram nesta aula — elas voltam na discussão da próxima.
Critério de pronto: os dois links abrem (repositório público e site no ar); o git log mostra pelo menos dois commits com mensagens descritivas; a captura de tela mostra Node, npm, Git e VS Code respondendo com suas versões.
Guarde no seu repositório: o link do repositório do projeto autoral, o link do site publicado e a captura de tela do terminal. Sem .zip.
CHACON, S.; STRAUB, B. Pro Git, 2ª ed., gratuito em português: https://git-scm.com/book/pt-br — capítulos 1 e 2 cobrem tudo da §8; o capítulo "Desfazendo Coisas" salva entregas.
QUEIRÓS, Ricardo; PORTELA, Filipe. Introdução ao Desenvolvimento Moderno para a Web: do front-end ao back-end, uma visão global. FCA, 2018 — capítulo introdutório: evolução e arquitetura da Web.
ALVES, William P. Projetos de Sistemas Web. Érica, 2015 — conceitos de cliente-servidor e planejamento de projetos web.
PUREWAL, Semmy. Aprendendo a Desenvolver Aplicações Web. Novatec, 2014 — capítulo 1: o fluxo de trabalho do desenvolvedor.
LOUDON, Kyle. Desenvolvimento de Grandes Aplicações Web. Novatec, 2019 — leitura de fôlego para quem quer ver onde a arquitetura desta aula escala.
Na próxima aula você entra no lado do cliente: o que o navegador faz com o código depois que a resposta HTTP chega, quem define os padrões da Web, como um site é servido de verdade e como organizar as pastas de um projeto. O index.html mínimo de hoje vira uma página com cabeçalho, navegação, conteúdo principal e rodapé, com uma folha de estilo própria — e cada git push continua publicando tudo sozinho.