Table of Contents
Desenvolvimento Frontend com Vue.js 💻
Domine a criação de interfaces modernas, reativas e de alta performance com Vue 3, Vite, Pinia e Vue Router.
Foco do Curso
Metodologia: Aprendizado prático focado na construção de Single Page Applications (SPAs) profissionais, utilizando as melhores práticas do ecossistema Vue.
🎯 O Que Você Vai Aprender
-
Fundamentos do Vue 3 --- Aprenda reatividade, Data Binding, diretivas e o poder da Composition API no desenvolvimento moderno. Ir para Módulo 1
-
Componentização --- Crie interfaces modulares e reutilizáveis através de componentes, props, eventos e slots para máxima produtividade. Ver Componentes
-
Ecossistema Vue --- Domine o gerenciamento de rotas com Vue Router e o estado global da aplicação com Pinia. Ver Ecossistema
-
Projetos Reais --- Aplique seus conhecimentos em projetos práticos, desde Task Managers até CRUDs consumindo APIs REST. Ver Projetos
📚 Jornada de Aprendizado (16 Aulas)
O curso é estruturado em quatro fases de especialização.
🧱 Fase 1: Fundamentos e Estrutura (Aulas 01-04)
- Aula 01 - Introdução ao Frontend Moderno 🚀
- Aula 02 - Estrutura do Projeto Vue 3 🏗️
- Aula 03 - Reatividade e Data Binding ⚛️
- Aula 04 - Diretivas e Renderização 📜
🏗️ Fase 2: Componentes e Prática (Aulas 05-08)
- Aula 05 - Componentes e Props 🧩
- Aula 06 - Eventos e Comunicação 📡
- Aula 07 - Ciclo de Vida e Hooks 🔄
- Aula 08 - Projeto Prático I (Task Manager) 📝
🔌 Fase 3: Ecossistema e Integração (Aulas 09-12)
- Aula 09 - Roteamento com Vue Router 🛣️
- Aula 10 - Consumo de API REST 🌐
- Aula 11 - Gerenciamento de Estado (Pinia) 🍍
- Aula 12 - Projeto Prático II (CRUD) 💾
🚀 Fase 4: Profissionalização e Final (Aulas 13-16)
- Aula 13 - Boas Práticas e Arquitetura 🏛️
- Aula 14 - Estilização Moderna 🎨
- Aula 15 - Build, Deploy e Produção 🚢
- Aula 16 - Projeto Final e Apresentação 🎓
Plano de Ensino 📅
Curso: Desenvolvimento Frontend com Vue.js 3
Ementa
- Módulo 1: Fundamentos do Frontend Moderno: Evolução do frontend, SPA vs MPA, Setup com Vite, Reatividade (Composition API) e Diretivas.
- Módulo 2: Componentização e Arquitetura: Single File Components (SFC), Props, Emits, Ciclo de Vida (Hooks) e Organização Profissional.
- Módulo 3: Roteamento, Estado e Integração: Vue Router, Consumo de API REST (Axios), Gerenciamento de Estado Global (Pinia) e CRUD completo.
- Módulo 4: Profissionalização e Boas Práticas: Scoped CSS, Clean Code no Vue, Build para Produção e Deploy Contínuo.
Cronograma (16 Aulas)
Módulo 1: Fundamentos do Frontend Moderno
- Aula 01: Introdução ao Frontend Moderno e Vue.js
- Aula 02: Estrutura do Projeto Vue 3 com Vite
- Aula 03: Reatividade e Data Binding (v-bind, v-model)
- Aula 04: Diretivas e Renderização Condicional (v-if, v-for)
Módulo 2: Componentização e Arquitetura
- Aula 05: Componentes: Criação, Registro e Props
- Aula 06: Comunicação entre Componentes (Emit e Eventos)
- Aula 07: Ciclo de Vida e Lifecycle Hooks
- Aula 08: Projeto Prático I: Task Manager (SPA)
Módulo 3: Roteamento, Estado e Integração
- Aula 09: Roteamento SPA com Vue Router
- Aula 10: Consumo de API REST com Axios (HTTP)
- Aula 11: Gerenciamento de Estado Global com Pinia
- Aula 12: Projeto Prático II: Integração API + Frontend (CRUD)
Módulo 4: Profissionalização e Boas Práticas
- Aula 13: Boas Práticas, Clean Code e Arquitetura Vue
- Aula 14: Estilização Moderna e Responsividade
- Aula 15: Build, Variáveis de Ambiente e Deploy (CI/CD)
- Aula 16: Projeto Final: Kanban System e Apresentação
Avaliação
- Exercícios: 16 listas de exercícios teóricos e práticos (1 por aula).
- Projetos: 16 mini-projetos de aplicação imediata.
- Quizzes: 16 testes de conhecimento (10 questões cada).
- Projeto Integrador: Desenvolvimento de um Sistema Kanban completo com autenticação simulada e consumo de API.
Aulas
Aula 01 – Introdução ao Frontend Moderno 🚀
Seja bem-vindo à primeira aula do curso de Desenvolvimento Frontend com Vue.js! Hoje vamos entender o que torna o frontend moderno tão poderoso e por que o Vue.js é uma das melhores escolhas para desenvolvedores hoje.
🧠 Conceitos Fundamentais
A Evolução do Frontend
Antigamente, a web era composta por páginas estáticas (HTML) enviadas pelo servidor. Hoje, trabalhamos com aplicações dinâmicas que rodam quase inteiramente no navegador do usuário.
| Era | Característica | Tecnologia |
|---|---|---|
| Página Estática | Documentos simples | HTML/CSS |
| Web 2.0 | Interatividade básica | jQuery/AJAX |
| Modern Web | Componentização e Reatividade | Vue/React/Angular |
SPA vs MPA
É crucial entender a diferença entre Single Page Application (SPA) e Multi Page Application (MPA).
graph TD
A[Usuário clica em link] --> B{Tipo de App}
B -- MPA --> C[Servidor recarrega página inteira]
B -- SPA --> D[JavaScript atualiza apenas o conteúdo necessário]
C --> E[Interface "pisca" e demora]
D --> F[Experiência fluida e instantânea]
[!NOTE] No Vue.js, focamos na construção de SPAs, onde o roteamento e a renderização acontecem no lado do cliente (Client-side Rendering).
📦 O que é Vue.js?
O Vue é um framework progressivo. Isso significa que você pode usá-lo apenas para uma pequena parte do seu site ou para construir uma aplicação inteira do zero.
Pilares do Vue 3:
- Reatividade: Os dados e a interface estão sempre sincronizados.
- Componentização: A interface é dividida em pequenas peças reutilizáveis.
- Fácil Aprendizado: Curva de aprendizado suave comparada a outros frameworks.
💻 Setup do Ambiente
Para começar, precisamos preparar nossa máquina.
[!IMPORTANT] Certifique-se de ter o Node.js (LTS) instalado em sua máquina antes de prosseguir.
📝 Exercício de Fixação
- Explique com suas palavras a principal vantagem de uma SPA sobre uma MPA.
- Instale o Node.js em sua máquina e execute os comandos acima para criar seu primeiro projeto "Hello World" com Vite.
🚀 Dica: No próximo encontro, vamos explorar a fundo a estrutura de pastas desse projeto que acabamos de criar!
Aula 02 – Estrutura do Projeto Vue 3 🏗️
Agora que temos o ambiente pronto, vamos entender cada arquivo e pasta gerada pelo Vite. Dominar a estrutura é o primeiro passo para organizar aplicações escaláveis.
📂 Visão Geral do Diretório
Quando você cria um projeto com npm create vite@latest, a seguinte estrutura é gerada:
node_modules/: Onde moram as bibliotecas que o Vue precisa.public/: Arquivos estáticos que não passam pelo processamento (como o favicon).src/: Onde a mágica acontece! Todo o seu código Vue ficará aqui.assets/: Imagens e estilos globais.components/: Seus componentes Vue reutilizáveis.App.vue: O componente raiz da aplicação.main.js: O ponto de entrada que "monta" o Vue no HTML.
index.html: O arquivo HTML principal (único na SPA).package.json: Lista de dependências e scripts do projeto.
🔍 O Ponto de Entrada: main.js
O arquivo main.js é responsável por inicializar a instância do Vue e conectá-la ao elemento #app do seu index.html.
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
createApp(App).mount('#app')
graph LR
A[index.html] -- contem --> B["div id='app'"]
C[main.js] -- importa --> D[App.vue]
C -- monta em --> B
🧩 Single File Components (SFC)
No Vue, usamos extensões .vue. Eles são chamados de Single File Components porque unem Estrutura, Lógica e Estilo em um único arquivo.
Anatomia de um arquivo .vue:
<template>
<!-- 1. Estrutura (HTML) -->
<div class="saudacao">
<h1>{{ mensagem }}</h1>
</div>
</template>
<script setup>
// 2. Lógica (JS/Composition API)
const mensagem = "Olá, Estrutura Vue!"
</script>
<style scoped>
/* 3. Estilo (CSS) */
h1 { color: #42b983; }
</style>
[!TIP] O atributo
scopedno<style>garante que o CSS deste arquivo não afete outros componentes da aplicação.
💻 Explorando o Projeto
Vamos rodar o projeto e ver as mudanças em tempo real.
[!WARNING] Nunca delete a
div#appdo seuindex.html, ou o Vue não terá onde renderizar os componentes!
📝 Exercício
- Explore a pasta
src/componentse identifique o componenteHelloWorld.vue. - Tente criar um novo arquivo chamado
MeuComponente.vuedentro da pastacomponentsseguindo a estrutura (Template, Script, Style).
🚀 Próxima Aula: Vamos aprender como o Vue gerencia dados de forma reativa!
Macro Syntax Error
File: aulas/aula-03.md
Line 12 in Markdown file: Expected an expression, got 'end of print statement'
Macro Syntax Error
File: aulas/aula-04.md
Line 15 in Markdown file: unexpected char '?' at 465
Aula 05 – Componentes e Props 🧩
A componentização é o coração do Vue.js. Em vez de uma página monolítica, dividimos a UI em pequenas peças independentes e reutilizáveis chamadas Componentes.
🏗️ Criando seu Primeiro Componente
Um componente no Vue é um arquivo .vue que pode ser importado por outros.
- Crie
src/components/CardUsuario.vue:
<template>
<div class="card">
<h2>{{ nome }}</h2>
<p>{{ profissao }}</p>
</div>
</template>
<script setup>
// Definindo o que o componente recebe de fora (Props)
defineProps(['nome', 'profissao'])
</script>
<style scoped>
.card { border: 1px solid #ccc; padding: 10px; border-radius: 8px; }
</style>
📥 Props: Comunicação Pai → Filho
As Props são canais de entrada de dados. Servem para passar informações do componente pai para o filho.
No arquivo App.vue (Pai):
<template>
<h1>Meus contatos:</h1>
<!-- Usando o componente e passando dados via Props -->
<CardUsuario nome="Ricardo" profissao="Desenvolvedor" />
<CardUsuario nome="Maria" profissao="Designer" />
</template>
<script setup>
import CardUsuario from './components/CardUsuario.vue'
</script>
graph TD
App[App.vue - Pai] -- "Passa: nome='Ricardo'" --> Card[CardUsuario.vue - Filho]
🛡️ Validação de Props
É uma boa prática definir explicitamente o tipo e se a prop é obrigatória para evitar erros de desenvolvimento.
defineProps({
nome: {
type: String,
required: true
},
idade: {
type: Number,
default: 18 // Valor caso não seja passado
}
})
🧠 Conceitos Chave
Componentes são Legos
Pense nos componentes como peças de Lego. Cada peça tem uma função específica e pode ser usada em diferentes lugares do "castelo" (sua aplicação).
💻 Mão na Massa
Crie um componente chamado AlertaMensagem.vue que receba uma prop tipo (pode ser 'sucesso' ou 'erro') e uma prop mensagem. Use o v-if para mudar a cor de fundo baseado no tipo.
📝 Exercício
- O que são Props e qual a direção que os dados fluem ao usá-las?
- Por que é importante usar o atributo
scopedno estilo de um componente? - Crie um componente
CardProduto.vueque receba nome, preço e uma booleanadisponivel.
🚀 Próxima Aula: Como o componente filho avisa o pai que algo aconteceu? Descubra os Emits!
Aula 06 – Eventos e Comunicação entre Componentes 📡
Já sabemos como enviar dados para baixo (Pai → Filho) com Props. Mas e se o filho precisar avisar ao pai que um botão foi clicado ou um formulário foi preenchido? Usamos Events (Emits).
📤 Emitindo Eventos (Filho → Pai)
O componente filho "grita" um evento e o pai fica "ouvindo".
1. No Componente Filho (BotaoAcao.vue):
<template>
<button @click="enviarClique">Clique aqui!</button>
</template>
<script setup>
// Declarando quais eventos este componente pode emitir
const emit = defineEmits(['clicouNoBotao'])
function enviarClique() {
// Emitindo o evento com um dado opcional
emit('clicouNoBotao', 'Dados enviados do filho')
}
</script>
2. No Componente Pai (App.vue):
<template>
<!-- Ouvindo o evento com @ (assim como @click) -->
<BotaoAcao @clicou-no-botao="tratarEvento" />
<p>Mensagem recebida: {{ mensagem }}</p>
</template>
<script setup>
import { ref } from 'vue'
import BotaoAcao from './components/BotaoAcao.vue'
const mensagem = ref('')
function tratarEvento(payload) {
mensagem.value = payload
}
</script>
📊 Fluxo de Comunicação
sequenceDiagram
participant P as Pai (App.vue)
participant F as Filho (BotaoAcao.vue)
P->>F: Props (Dados)
Note over F: Usuário interage
F-->>P: Emit (Evento)
🔄 Comunicação entre Irmãos
Componentes "irmãos" não se comunicam diretamente. * Padrão: O irmão enviador emite para o pai, e o pai passa para o outro irmão via Prop. * Avançado: Veremos no futuro o uso de Stores (Pinia) para estado global.
🧠 Boas Práticas
Nomes de Eventos
Enquanto props usam camelCase no script e kebab-case no HTML, os eventos devem, por convenção, sempre usar kebab-case nos emits: emit('atualizar-lista').
💻 Mão na Massa
Crie um componente ItemTarefa.vue que tenha um botão para "Remover". Ao clicar, ele deve emitir um evento remover passando o ID da tarefa para o pai.
📝 Exercício
- Qual a diretiva usada no pai para "ouvir" um evento emitido pelo filho?
- Como passamos dados adicionais junto com um evento emitido?
- Explique por que componentes irmãos não se falam diretamente.
🚀 Próxima Aula: Vamos conhecer os momentos "mágicos" do Vue com o Ciclo de Vida!
Aula 07 – Ciclo de Vida e Hooks 🔄
Todo componente Vue passa por uma série de etapas desde o momento em que é criado até ser destruído. Essas etapas são chamadas de Lifecycle Hooks.
🏗️ O Ciclo de Vida
Imagine o componente como um ser vivo: ele nasce (mount), cresce/muda (update) e morre (unmount).
graph TD
A[Setup] --> B[onMounted]
B --> C{Dado mudou?}
C -- Sim --> D[onUpdated]
D --> C
C -- Fechou página --> E[onUnmounted]
🎣 Hooks mais comuns
onMounted
Chamado quando o componente está pronto na tela. É o lugar perfeito para buscar dados de uma API ou configurar timers.
<script setup>
import { onMounted } from 'vue'
onMounted(() => {
console.log("O componente apareceu na tela! 🚀")
// Iniciar chamada de API aqui
})
</script>
onUnmounted
Chamado logo antes do componente ser removido do DOM. Ótimo para limpar "lixo", como parar intervalos de tempo ou remover event listeners globais.
<script setup>
import { onMounted, onUnmounted } from 'vue'
let intervalId
onMounted(() => {
intervalId = setInterval(() => console.log("Ping!"), 1000)
})
onUnmounted(() => {
clearInterval(intervalId) // Limpeza necessária para não travar o navegador
})
</script>
🧠 Por que usar Hooks?
Organização
Os hooks permitem que você execute código em momentos estratégicos, garantindo que sua aplicação seja performática e não tenha vazamentos de memória (memory leaks).
🧱 Organização de Pastas Profissional
À medida que o projeto cresce, a pasta src/ deve ser organizada:
* src/components/: Componentes genéricos (Botões, Inputs).
* src/views/: Componentes que representam páginas inteiras.
* src/services/: Arquivos JavaScript para chamadas de API.
💻 Prática Sugerida
Crie um componente que mostre um relógio digital que atualiza a cada segundo usando setInterval. Lembre-se de usar o onUnmounted para parar o relógio se o usuário sair da página.
📝 Exercício
- Em qual hook devemos fazer requisições para o servidor?
- O que acontece se não limparmos um
setIntervalnoonUnmounted? - Qual hook é disparado toda vez que um dado reativo exibido na tela é alterado?
🚀 Próxima Aula: Chegou a hora do nosso primeiro Projeto Prático Integrador! Vamos construir um Task Manager do zero.
Aula 08 – Projeto Prático I (Task Manager) 📋
Chegou a hora de consolidar tudo o que aprendemos nos Módulos 1 e 2. Vamos construir uma aplicação de Gerenciamento de Tarefas (Task Manager) aplicando componentização, reatividade, props e emits.
🎯 Escopo do Projeto
Nossa aplicação permitirá: 1. Adicionar novas tarefas. 2. Listar tarefas existentes. 3. Marcar tarefas como concluídas. 4. Remover tarefas. 5. Visualizar o progresso (contador de tarefas).
🏗️ Estrutura de Componentes
Para uma organização profissional, vamos dividir o projeto assim:
App.vue: Gerencia o estado global (a lista de tarefas).FormTarefa.vue: Componente para entrada de dados.ListaTarefas.vue: Renderiza a lista de itens.ItemTarefa.vue: Exibe uma única tarefa com ações de remover/concluir.
graph TD
App[App.vue - Estado Global]
App --> Form[FormTarefa.vue - Input]
App --> Lista[ListaTarefas.vue - Listagem]
Lista --> Item[ItemTarefa.vue - Detalhe]
💻 Implementação Passo a Passo
# 1. Crie os arquivos vazios na pasta components
$ touch src/components/FormTarefa.vue
$ touch src/components/ItemTarefa.vue
# 2. Foque na lógica do App.vue
# Use ref para a lista de tarefas: const tarefas = ref([])
# 3. Implemente a comunicação
# FormTarefa EMITE 'adicionar' -> App.vue
# App.vue passa PROPS -> ListaTarefas -> ItemTarefa
💡 Dicas de Implementação
ID Único
Ao adicionar uma tarefa, use Date.now() como ID para gerar valores únicos para a :key do v-for.
Persistência Local (Bônus)
Tente usar o localStorage dentro do hook onMounted para carregar as tarefas salvas e um watch para salvar sempre que a lista mudar!
🎨 Desafio Visual
Utilize o que aprendeu sobre CSS Scoped para:
* Riscar o texto da tarefa quando estiver concluída (text-decoration: line-through).
* Mudar a cor de fundo do botão "Remover" para vermelho.
📝 Checkpoint de Entrega
Ao final desta aula, o aluno deve ter uma pasta src/ organizada, sem erros no console do navegador e com a reatividade funcionando plenamente entre os 4 componentes criados.
🚀 Próxima Aula: Vamos sair da página única e aprender a criar múltiplas rotas com o Vue Router!
Aula 09 – Roteamento com Vue Router 🛣️
Em uma Single Page Application (SPA), não mudamos de arquivo HTML ao navegar. Em vez disso, o JavaScript troca o componente que está sendo exibido na tela. O responsável por isso é o Vue Router.
🏗️ Conceito de Rota
Uma rota mapeia uma URL (ex: /contato) para um componente (ex: ContatoView.vue).
graph LR
URL["/sobre"] --> Router[Vue Router]
Router --> Comp[SobreView.vue]
Comp --> Tela[Interface Atualizada]
⚙️ Configuração Básica
Geralmente configuramos as rotas em um arquivo dedicado: src/router/index.js.
import { createRouter, createWebHistory } from 'vue-router'
import HomeView from '../views/HomeView.vue'
import SobreView from '../views/SobreView.vue'
const router = createRouter({
history: createWebHistory(),
routes: [
{ path: '/', component: HomeView },
{ path: '/sobre', component: SobreView }
]
})
export default router
🧩 Componentes do Router
O Vue Router nos fornece dois componentes essenciais:
<RouterView />: O "buraco" onde o componente da rota ativa será renderizado.<RouterLink>: O substituto da tag<a>para navegação interna sem recarregar a página.
<!-- App.vue -->
<template>
<nav>
<RouterLink to="/">Home</RouterLink> |
<RouterLink to="/sobre">Sobre</RouterLink>
</nav>
<main>
<RouterView /> <!-- Componente da rota aparece aqui -->
</main>
</template>
⚡ Navegação Programática
Às vezes, queremos mudar de página via código (ex: após o login).
import { useRouter } from 'vue-router'
const router = useRouter()
function irParaHome() {
router.push('/')
}
🛡️ Guards de Rota
Podemos impedir que o usuário acesse certas páginas se não estiver logado.
Segurança
router.beforeEach permite verificar permissões antes de carregar a rota. Lembre-se que segurança real deve ser feita no Backend; no Frontend é apenas para UX.
💻 Mão na Massa
- Instale o router:
npm install vue-router@4. - Crie duas "Views" simples na pasta
src/views. - Configure o roteador e use o
<RouterView />no seuApp.vue.
📝 Exercício
- Qual a diferença entre usar
<a>e<RouterLink>em uma SPA? - Para que serve o componente
<RouterView />? - Como passamos parâmetros dinâmicos em uma rota (ex:
/perfil/123)?
🚀 Próxima Aula: Vamos conectar nosso app ao mundo real consumindo uma API REST!
Aula 10 – Consumo de API REST 🌐
Nenhuma aplicação moderna vive isolada. Precisamos buscar dados de servidores e salvar informações. Para isso, usamos o protocolo HTTP e a biblioteca Axios.
🏗️ O que é uma API REST?
É uma forma padronizada de comunicação entre sistemas. Usamos Verbos HTTP para dizer o que queremos fazer:
- GET: Buscar dados.
- POST: Criar novos dados.
- PUT: Atualizar dados existentes.
- DELETE: Remover dados.
🚀 Usando Axios no Vue
O Axios é um cliente HTTP baseado em Promessas que facilita muito as requisições.
Exemplo de busca de dados no onMounted:
<script setup>
import { ref, onMounted } from 'vue'
import axios from 'axios'
const usuarios = ref([])
onMounted(async () => {
try {
const response = await axios.get('https://api.exemplo.com/users')
usuarios.value = response.data
} catch (error) {
console.error("Erro ao carregar usuários:", error)
}
})
</script>
📊 Fluxo da Requisição
sequenceDiagram
participant V as Vue (Client)
participant A as API (Server)
V->>A: GET /produtos
Note right of A: Processa no Banco de Dados
A-->>V: JSON { id: 1, nome: 'Teclado' }
Note left of V: Vue atualiza a Ref e a tela muda!
🧱 Organização: O padrão Service
Não é bom espalhar axios.get por todos os componentes. Criamos uma pasta services/ para isolar a lógica de API.
Service Pattern
Crie src/services/api.js para configurar a URL base e reutilizar as funções de chamada.
🧠 Tratamento de Erros e Loading
Experiência do Usuário (UX)
Sempre mostre um "Carregando..." enquanto a API não responde e trate erros com mensagens amigáveis para o usuário caso o servidor caia.
💻 Prática Sugerida
Utilize a JSONPlaceholder (uma API de testes gratuita) para listar posts de um blog falso em seu projeto Vue.
📝 Exercício
- Qual a vantagem do Axios sobre o
fetchnativo do navegador? - Por que usamos o
async/awaitao lidar com requisições HTTP? - O que acontece com a interface do Vue quando atribuímos o resultado da API a uma
ref?
🚀 Próxima Aula: Como compartilhar dados entre páginas sem ficar passando centenas de props? Conheça o Pinia!
Macro Rendering Error
File: aulas/aula-11.md
UndefinedError: 'carrinho' is undefined
Traceback (most recent call last):
File "/home/runner/work/ads_spec_frontend_com_vue/ads_spec_frontend_com_vue/.venv/lib/python3.11/site-packages/mkdocs_macros/plugin.py", line 703, in render
return md_template.render(**page_variables)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/runner/work/ads_spec_frontend_com_vue/ads_spec_frontend_com_vue/.venv/lib/python3.11/site-packages/jinja2/environment.py", line 1295, in render
self.environment.handle_exception()
File "/home/runner/work/ads_spec_frontend_com_vue/ads_spec_frontend_com_vue/.venv/lib/python3.11/site-packages/jinja2/environment.py", line 942, in handle_exception
raise rewrite_traceback_stack(source=source)
File "<template>", line 58, in top-level template code
File "/home/runner/work/ads_spec_frontend_com_vue/ads_spec_frontend_com_vue/.venv/lib/python3.11/site-packages/jinja2/environment.py", line 490, in getattr
return getattr(obj, attribute)
^^^^^^^^^^^^^^^^^^^^^^^
jinja2.exceptions.UndefinedError: 'carrinho' is undefined
Aula 12 – Projeto Prático II (CRUD Completo) 🚀
Nesta aula prática, vamos aplicar a "Trindade do Vue Moderno": Vue Router + Axios + Pinia. O objetivo é construir um sistema de Gerenciamento de Produtos com persistência em uma API simulada.
🎯 Escopo do Projeto
Vamos desenvolver um CRUD (Create, Read, Update, Delete) que realize: 1. Listagem: Buscar produtos de uma API e exibir em cards (Axios + Pinia). 2. Criação: Formulário para adicionar novos itens (POST). 3. Edição: Alterar dados de um produto existente (PUT). 4. Exclusão: Remover itens da API e da tela (DELETE). 5. Navegação: Páginas separadas para "Home", "Produtos" e "Novo Produto".
🏗️ Arquitetura em Camadas
A organização profissional separa as responsabilidades:
graph TD
View[Views / Páginas] --> Store[Pinia Stores]
Store --> Service[Axios Services]
Service --> API[(API Externa)]
O que cada camada faz?
- Service: Apenas faz a requisição
axios.get('/produtos'). - Store: Chama o service e guarda o resultado na
ref([]). - View: Apenas exibe o que está na Store e chama funções de clique.
🖥️ Estrutura de Pastas Recomendada
💡 Dicas de Implementação
API de Teste
Use o JSON Server localmente para ter uma API real rodando em minutos, ou use mocks simples no código se preferir focar apenas no Vue.
Chave Reativa
Ao editar um produto, lembre-se de usar o useRoute().params.id do Vue Router para buscar o ID correto da URL.
📊 Fluxo de Dados do CRUD
sequenceDiagram
participant U as Usuário
participant V as View
participant S as Store
participant A as API
U->>V: Clica em 'Excluir'
V->>S: store.excluir(id)
S->>A: DELETE /produtos/1
A-->>S: 200 OK
S->>S: Remove do array local
Note right of S: Reatividade atualiza a View automaticamente!
📝 Checkpoint de Entrega
Para concluir esta aula, o aluno deve demonstrar: 1. Navegação fluida entre páginas sem recarregar o browser. 2. Dados sendo buscados de uma fonte externa (real ou mock). 3. Uso do Pinia para gerenciar o array de produtos.
🚀 Próximo Módulo: Vamos profissionalizar ainda mais com Boas Práticas, Estilização e Deploy!
Aula 13 – Boas Práticas e Arquitetura 🏰
Escrever código que funciona é apenas o primeiro passo. Como desenvolvedores profissionais, nosso objetivo é escrever código que seja fácil de ler, testar e manter.
🏛️ Separação de Responsabilidades
Um erro comum é colocar muita lógica dentro do componente (.vue). Siga a regra de ouro: Componentes devem apenas exibir dados e emitir eventos.
| Camada | Função | Exemplo |
|---|---|---|
| Views | Páginas principais | HomeView.vue |
| Components | Peças reutilizáveis | BaseButton.vue |
| Stores | Estado Compartilhado | userStore.js |
| Services | Comunicação Externa | authService.js |
| Utils | Funções Auxiliares | formatDate.js |
🧼 Clean Code no Vue
- Nomes de Componentes: Use sempre pelo menos duas palavras para evitar conflitos com tags HTML (ex:
UserCardem vez deCard). - Props Tipadas: Sempre valide suas props.
- Composição over Mixins: No Vue 3, prefira extrair lógica repetida para Composables (
useAlgo.js). - Emits Declarados: Use
defineEmitspara documentar o que o componente faz.
📊 Estrutura de Composable
graph LR
A[Lógica Repetida] --> B[useCounter.js]
B --> C[Componente A]
B --> D[Componente B]
B --> E[Componente C]
Exemplo de um Composable simples:
// src/composables/useMouse.js
import { ref, onMounted, onUnmounted } from 'vue'
export function useMouse() {
const x = ref(0)
const y = ref(0)
function update(event) {
x.value = event.pageX
y.value = event.pageY
}
onMounted(() => window.addEventListener('mousemove', update))
onUnmounted(() => window.removeEventListener('mousemove', update))
return { x, y }
}
🧠 Padrão de Nomenclatura
Dica de Ouro
Componentes que são usados apenas uma vez (como Header, Footer) devem ter o prefixo The (ex: TheNavbar.vue). Componentes reutilizáveis devem ter prefixos como Base, App ou V (ex: BaseButton.vue).
📝 Exercício
- Qual a vantagem de usar Composables em vez de colocar toda a lógica no componente?
- Refatore um componente seu que tenha mais de 100 linhas de lógica para usar um Composable ou um Service.
- Por que devemos evitar nomes de uma única palavra para componentes?
🚀 Próxima Aula: Vamos deixar nossa aplicação bonita e responsiva com Scoped CSS e Tailwind!
Aula 14 – Estilização Moderna 🎨
Uma aplicação excelente não apenas funciona bem, mas também é agradável de usar. No Vue.js, temos várias formas de gerenciar estilos de forma organizada.
🔐 Scoped CSS
Como já vimos, o atributo scoped garante que o CSS de um componente não "vaze" para os outros. O Vue faz isso adicionando um atributo único (ex: data-v-123) ao HTML e ao CSS durante o build.
📦 CSS Modules
Uma alternativa ao Scoped CSS, onde as classes se tornam objetos JavaScript.
<template>
<h1 :class="$style.titulo">Olá Mundo</h1>
</template>
<style module>
.titulo { color: red; }
</style>
🌊 Introdução ao Tailwind CSS
O Tailwind é um framework "utility-first" que permite estilizar sua aplicação sem sair do HTML. Ele é extremamente popular no ecossistema Vue.
Por que usar?
- Velocidade: Não precisa inventar nomes de classes.
- Consistência: Sistema de design pré-definido.
- Responsividade: Prefixos simples como
md:,lg:.
Exemplo:
<button class="bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded">
Botão Tailwind
</button>
📱 Responsividade no Vue
graph LR
A[Layout Único] --> B{Breakpoints}
B -- "sm (mobile)" --> C[Coluna Única]
B -- "md (tablet)" --> D[Duas Colunas]
B -- "lg (desktop)" --> E[Grid Complexo]
🧠 Dicas de UX
Feedback Visual
Sempre adicione estados de :hover, :active e :disabled aos seus botões e links. Isso faz a aplicação parecer "viva".
Transições
O Vue oferece o componente <Transition> para animar a entrada e saída de elementos (ex: ao usar v-if).
💻 Prática Sugerida
- Adicione o Tailwind ao seu projeto:
npx tailwindcss init -p. - Estilize seu "Task Manager" da Aula 08 usando apenas classes utilitárias do Tailwind.
📝 Exercício
- Qual a diferença entre Scoped CSS e CSS Modules?
- Como o Tailwind ajuda na manutenção a longo prazo de grandes aplicações?
- Crie um componente que mude de cor de fundo dependendo de uma variável reativa
isError.
🚀 Próxima Aula: Vamos preparar nosso app para o mundo real com Build e Deploy!
Aula 15 – Build, Deploy e Produção 🚀
Sua aplicação está pronta no seu computador, mas como mostrá-la para o mundo? Nesta aula, aprenderemos o processo de transformar nosso código de desenvolvimento em um pacote otimizado para produção.
🏗️ O Processo de Build
Quando rodamos npm run build, o Vite realiza várias otimizações:
1. Minificação: Remove espaços e encurta nomes de variáveis (diminui o tamanho do arquivo).
2. Tree Shaking: Remove código que não está sendo usado.
3. Chunking: Divide o código em arquivos menores para carregar mais rápido.
🌐 Variáveis de Ambiente (.env)
Nunca coloque senhas ou URLs de produção diretamente no código. Use arquivos .env.
No Vue: import.meta.env.VITE_API_URL
🚢 Estratégias de Deploy
Temos várias opções excelentes e gratuitas para hospedar SPAs:
- Vercel / Netlify: Conectam ao seu GitHub e fazem deploy automático a cada
git push. - GitHub Pages: Ótimo para projetos estáticos e portfólios.
- Docker: Para quando você precisa de controle absoluto do servidor.
graph LR
A[Código no VS Code] --> B[Git Push GitHub]
B --> C[CI/CD: Build Automático]
C --> D[Deploy: Vercel/Netlify]
D --> E[Usuário acessa URL Pública]
🧪 Boas Práticas de Produção
Segurança
Certifique-se de que as ferramentas de desenvolvedor (Vue DevTools) estão desativadas em produção (o Vite faz isso automaticamente no build).
Performance
Use imagens otimizadas e carregamento preguiçoso (Lazy Loading) para rotas que o usuário raramente acessa.
💻 Mão na Massa
- Crie uma conta na Vercel ou Netlify.
- Conecte seu repositório do GitHub.
- Configure o comando de build (
npm run build) e a pasta de saída (dist). - Veja seu site ganhar uma URL pública!
📝 Exercício
- Para que serve a pasta
distgerada após o build? - Por que devemos usar arquivos
.envpara URLs de API? - O que é CI/CD e como ele facilita a vida do desenvolvedor?
🚀 Chegou a Hora! Na próxima aula, você apresentará seu Projeto Final: Um sistema Kanban completo!
Aula 16 – Projeto Final e Apresentação 🏆
Parabéns! Você chegou ao final da jornada de Desenvolvimento Frontend com Vue.js. Hoje é o dia de consolidar todo o conhecimento adquirido através do desenvolvimento e apresentação do seu Projeto Final.
🎯 O Desafio: Sistema Kanban (VueFlow)
Você deverá desenvolver um sistema de gerenciamento de tarefas estilo Kanban (colunas: Pendente, Em Andamento, Concluído). O sistema deve permitir que o usuário gerencie suas atividades de forma visual e intuitiva.
Requisitos Obrigatórios:
- Componentização: Dividir a interface em colunas e cards reutilizáveis.
- Roteamento: Ter pelo menos duas páginas (Dashboard e Configurações/Perfil).
- Estado Global (Pinia): Armazenar a lista de tarefas centralizadamente.
- Integração (Axios): Simular o consumo de cores ou perfis de uma API.
- Estilização: Uso de Tailwind CSS ou Scoped CSS com foco em responsividade.
- Interatividade: No mínimo, a funcionalidade de mover tarefas entre colunas e deletá-las.
📊 Arquitetura Esperada
graph TD
A[App.vue] --> B[Navbar]
A --> C[RouterView]
C -- Rota: / --> D[KanbanBoard]
C -- Rota: /config --> E[ConfigView]
D --> F[Coluna: ToDo]
D --> G[Coluna: Doing]
D --> H[Coluna: Done]
F --> I[CardTarefa]
G --> I
H --> I
I --> J[Store: TaskStore]
📝 Critérios de Avaliação Técnica
Sua aplicação será avaliada com base nos seguintes pontos: * Organização do Código: Pastas bem estruturadas (views, components, stores, services). * Clean Code: Nomes de variáveis semânticos e funções pequenas. * UX/UI: A interface é amigável? Existem feedbacks visuais de carregamento ou erro? * Versionamento: Histórico de commits no Git (GitHub). * Deploy: Aplicação funcional e acessível via URL pública (Vercel/Netlify).
🧠 Dica para a Apresentação
O Pitch
Ao apresentar, não mostre apenas o código. Mostre o problema que sua aplicação resolve, os desafios técnicos que você enfrentou e como o Vue.js ajudou a superá-los.
🏁 Encerramento
O desenvolvimento frontend é uma área em constante evolução. Dominar o Vue 3 te coloca em uma posição privilegiada no mercado, apto a trabalhar com alta produtividade e qualidade.
Desejamos muito sucesso em sua carreira como desenvolvedor Vue! 🚀✨
Exercícios
Listas de Exercícios 🏋️
Pratique o que aprendeu com desafios graduais para cada aula.
-
Módulo 1: Fundamentos ---
-
Módulo 2: Componentização ---
-
Módulo 3: Ecossistema ---
-
Módulo 4: Profissional ---
Exercícios: Aula 01 - Introdução ao Frontend Moderno 🏗️
1. Pesquisa: Ecossistema Frontend
Pesquise e descreva com suas palavras qual a diferença entre uma SPA (Single Page Application) e uma MPA (Multi Page Application). Cite um exemplo real de site para cada uma.
2. Por que o Vue?
O Vue.js é conhecido por ser um "Framework Progressivo". O que isso significa na prática para um desenvolvedor que já possui um site em HTML estático e quer começar a usar o Vue?
3. Diferença de Ferramental
Antigamente, usávamos o Vue CLI como ferramenta padrão de criação de projetos. Hoje, a recomendação oficial é o Vite. Liste 3 motivos pelos quais o Vite é considerado superior ao Vue CLI em termos de experiência de desenvolvimento (DX).
4. Renderização CSR vs SSR
Explique o conceito de Client-Side Rendering (CSR). O que acontece no navegador do usuário no momento em que ele acessa um site construído com Vue (sem SSR)?
5. Desafio: Instalação do Ambiente
Instale o Node.js em sua máquina (prefira a versão LTS). No terminal, execute o comando node -v e npm -v e tire um print das versões instaladas. Além disso, instale a extensão Vue - Official (antiga Volar) no seu VS Code.
Exercícios: Aula 02 - Estrutura do Projeto Vue 3 🏗️
1. Anatomia de um SFC
O que é um SFC (Single File Component) no contexto do Vue? Descreva a função de cada uma das 3 tags principais encontradas em um arquivo .vue.
2. Criação de Projeto
Utilizando o terminal, execute o comando para criar um novo projeto Vite: npm create vite@latest meu-primeiro-app-vue. Selecione o framework Vue e a variante JavaScript. Entre na pasta, instale as dependências e inicie o servidor de desenvolvimento.
3. Entendendo o main.js
Abra o arquivo src/main.js. Explique qual a função das seguintes linhas de código:
4. Pasta Public vs Assets
Qual a diferença entre colocar uma imagem na pasta public/ e na pasta src/assets/? Em qual delas o Vite realiza otimizações durante o processo de build?
5. Desafio: Alterando o Componente Raiz
Abra o arquivo src/App.vue. Limpe o conteúdo original e crie um componente simples que exiba um título <h1> com o seu nome e um parágrafo <p> com a sua frase favorita. Verifique se a mudança foi refletida no navegador instantaneamente.
Exercícios: Aula 03 - Reatividade e Data Binding ⚛️
1. Ref vs Reactive
Explique quando é mais vantajoso usar a função ref() em vez de reactive() para criar variáveis reativas. Cite um exemplo de código para cada uma.
2. Interpolação de Texto
Crie uma variável reativa chamada contador iniciando em 0. Exiba esse valor no HTML dentro de um <h2> utilizando a sintaxe de chaves duplas (Mustache). Adicione um botão que, ao ser clicado, aumente o valor desse contador no script.
3. Atribuição de Atributos (v-bind)
Imagine que você tem uma variável reativa linkImagem contendo a URL de uma foto. Como você faria para aplicar essa URL ao atributo src de uma tag <img> de forma dinâmica? Escreva a sintaxe completa e a sintaxe curta (atalho).
4. Two-Way Data Binding (v-model)
Crie um campo de input de texto e um parágrafo abaixo dele. Use a diretiva v-model para que tudo o que o usuário digitar no input apareça instantaneamente dentro do parágrafo. Qual o nome desse conceito de sincronização bidirecional?
5. Desafio: Profiler Simples
Crie um objeto reativo (usando reactive) chamado usuario com as propriedades nome e idade. Crie dois inputs no HTML (um para nome e outro para idade) ligados a esse objeto via v-model. Exiba uma frase formatada como: "Olá, meu nome é [nome] e tenho [idade] anos".
Exercícios: Aula 04 - Diretivas e Renderização 📜
1. Exibição Condicional
Qual a diferença técnica entre usar v-if e v-show para esconder um elemento na tela? Em qual cenário de performance o v-show é mais recomendado?
2. Renderização de Listas
Crie um array reativo chamado frutas contendo ["Maçã", "Banana", "Uva"]. Use a diretiva v-for para renderizar esses nomes dentro de uma lista não ordenada (<ul> e <li>). Não esqueça de utilizar o atributo :key.
3. Captura de Eventos (v-on)
Crie um botão que dispare um alerta (alert) com a mensagem "Olá Vue!" ao ser clicado. Demonstre o uso da sintaxe completa (v-on:click) e do atalho (@click).
4. Modificadores de Evento
Explique para que serve o modificador .prevent em um evento de submissão de formulário (@submit.prevent). O que acontece se não o utilizarmos em uma SPA?
5. Desafio: Lista de Tarefas Simples (V1)
Crie uma variável reativa novaTarefa (string) e uma lista tarefas (array).
- Crie um input ligado à novaTarefa via v-model.
- Crie um botão "Adicionar" que pegue o valor de novaTarefa, adicione ao array tarefas e limpe o input.
- Renderize a lista na tela usando v-for.
- Adicione um v-if para mostrar uma mensagem "Sua lista está vazia" caso não haja tarefas.
Exercícios: Aula 05 - Componentes e Props 🧩
1. Vantagens da Componentização
Explique brevemente por que dividimos uma aplicação em componentes em vez de manter todo o código em um único arquivo gigante. Como isso ajuda no trabalho em equipe?
2. Criando um Componente de Botão
Crie um arquivo chamado BotãoCustomizado.vue na pasta src/components/.
- Esse componente deve aceitar uma prop chamada texto (String).
- Renderize o texto dentro de uma tag <button>.
- No componente App.vue, importe e use esse botão 3 vezes com textos diferentes.
3. Tipagem e Validação de Props
Modifique o defineProps do exercício anterior para que a prop texto seja obrigatória (required) e possua um valor padrão caso não seja enviada. Como o Vue avisa se passarmos um número em vez de uma string para essa prop?
4. Passando Objetos como Prop
Crie um componente CardUsuario.vue que receba um objeto usuario como prop. O objeto deve conter nome, email e cargo. Renderize essas informações de forma organizada (ex: usando <div>, <h3> e <p>).
5. Desafio: Galeria de Produtos
Crie um array de objetos produtos em App.vue. Cada produto deve ter id, nome e preco.
- Crie um componente ItemProduto.vue que receba os dados de um produto via prop.
- No App.vue, use um v-for para renderizar o componente ItemProduto.vue para cada item do array.
Exercícios: Aula 06 - Eventos e Comunicação 📡
1. Para que serve o Emits?
Explique a diferença entre usar Props e usar Emits. Qual das duas ferramentas é usada para enviar dados do filho para o pai?
2. Disparando um Evento Simples
Crie um componente ContadorFilho.vue com um botão "Incrementar".
- Ao clicar no botão, o componente deve emitir um evento chamado aumentar.
- No componente Pai (App.vue), escute o evento @aumentar e incremente uma variável reativa local.
3. Enviando Dados (Payload) no Evento
Modifique o exercício anterior para que o filho envie o valor do incremento (ex: 5 ou 10) como argumento do evento.
emit('aumentar', 5). Como o pai recebe esse valor na função de tratamento?
4. Comunicação entre Irmãos
Imagine dois componentes filhos (A e B) no mesmo nível dentro de um Pai. O Filho A tem um botão que precisa mudar um texto no Filho B. Descreva os passos necessários para que essa comunicação ocorra seguindo o fluxo padrão do Vue.
5. Desafio: Deletar item da Lista
Utilize a galeria de produtos do exercício da aula anterior.
- Adicione um botão "Remover" dentro do componente ItemProduto.vue.
- Ao clicar em "Remover", o componente deve emitir um evento remover passando o id do produto.
- O componente Pai deve ouvir o evento e remover o produto correspondente do array original.
Exercícios: Aula 07 - Ciclo de Vida e Hooks 🔄
1. O que é o Ciclo de Vida?
Descreva o que acontece em um componente Vue desde o momento em que ele é importado até o momento em que o usuário navega para outra página e ele desaparece da tela.
2. O Hooks onMounted
Qual a utilidade do hook onMounted? Por que não é recomendado fazer chamadas de inicialização de timers ou APIs diretamente no corpo do <script setup> sem o hook?
3. O Hook onUnmounted
Crie um componente que inicie um setInterval no onMounted que imprima uma mensagem no console a cada 1 segundo. Use o hook onUnmounted para limpar esse timer (clearInterval). Por que essa limpeza é fundamental para o navegador?
4. Reatividade vs Lifecycle
Suponha que um dado mude e a tela se atualize. Qual hook do ciclo de vida é disparado APÓS essa atualização visual ocorrer? Cite um exemplo de uso para esse hook.
5. Desafio: Relógio Digital Reativo
Crie um componente de relógio que exiba as horas, minutos e segundos atualizados em tempo real.
- Use onMounted para iniciar o relógio.
- Use onUnmounted para pará-lo.
- Use uma ref para armazenar o horário atual.
- Formate a exibição para que sempre tenha dois dígitos (ex: 09:05:01).
Exercícios: Aula 08 - Projeto Prático I: Task Manager (Planejamento) 📝
1. Planejamento de Componentes
Para o nosso Task Manager, quais componentes você acredita serem necessários para manter o projeto organizado? Liste pelo menos 3 e descreva a responsabilidade de cada um.
2. Definição de Dados (State)
Que tipo de informações cada "Tarefa" (Task) deve conter no nosso array de tarefas? Defina um objeto exemplo com as propriedades necessárias (ex: título, status, id).
3. Fluxo de Criação
Descreva o passo a passo lógico (do input do usuário até a atualização da tela) para a funcionalidade de "Adicionar Nova Tarefa". Quais diretivas e eventos serão utilizados?
4. Persistência Local (LocalStorage)
Pesquise como salvar e ler dados do LocalStorage do navegador. Escreva um exemplo de código que salva o array de tarefas e outro que o recupera ao carregar a página.
5. Desafio: Maquete do App
Crie a estrutura visual básica do App em um único arquivo App.vue (sem separar componentes ainda).
- Deve ter um título centralizado.
- Um input com botão ao lado.
- Uma área para listar as tarefas.
- Use CSS (pode ser CSS puro ou classes utilitárias) para deixar o layout limpo e agradável.
- Implemente apenas a funcionalidade de listar tarefas estáticas por enquanto.
Exercícios: Aula 09 - Roteamento com Vue Router 🛣️
1. SPA vs Roteamento Tradicional
Em uma Single Page Application, o que realmente acontece quando o usuário "muda de página"? Explique o papel do Vue Router nesse processo.
2. Configurando Rotas
Crie um arquivo router/index.js (esquemático) que defina duas rotas:
- A rota / que renderiza o componente HomeView.vue.
- A rota /sobre que renderiza o componente AboutView.vue.
Utilize o createRouter e o createWebHistory.
3. Navegação vs Links
Qual a diferença entre usar <a href="/sobre"> e <router-link to="/sobre"> em uma aplicação Vue? O que acontece com o estado da aplicação no primeiro caso?
4. Parâmetros Dinâmicos
Crie uma rota que receba um ID de produto dinamicamente: /produto/:id. Dentro do componente de destino, como você faria para capturar esse ID e exibi-lo na tela usando a Composition API?
5. Desafio: Barra de Navegação
Crie um componente NavBar.vue que contenha links para "Home", "Produtos" e "Contato". Use classes CSS para destacar o link da página que está ativa no momento (pesquise a classe automática router-link-active).
Exercícios: Aula 10 - Consumo de API REST 🌐
1. Promises e Async/Await
Converta a seguinte estrutura de .then() para uma função usando async/await com bloco try/catch:
2. Configuração do Axios
Instale o Axios no seu projeto (npm install axios). Crie uma instância customizada do Axios em src/services/api.js que já possua uma baseURL definida (ex: https://jsonplaceholder.typicode.com).
3. Exibindo Dados da API
Crie um componente que, ao ser montado (onMounted), dispare uma requisição GET para a rota /posts da API JSONPlaceholder. Armazene o resultado em um array reativo e exiba apenas os títulos dos 10 primeiros posts na tela.
4. Feedback de Carregamento
Adicione uma variável reativa loading (booleana) ao componente anterior. Inicie-a como true, e mude para false após a conclusão da requisição. Use um v-if no HTML para exibir uma mensagem "Carregando..." enquanto os dados não chegam.
5. Desafio: Buscador de Usuário
Crie um input de texto onde o usuário digita um ID. Ao clicar em um botão "Buscar", o app deve fazer um GET para /users/:id. Exiba o nome e o e-mail do usuário encontrado ou uma mensagem "Usuário não encontrado" em caso de erro 404.
Exercícios: Aula 11 - Gerenciamento de Estado (Pinia) 🍍
1. Por que usar Pinia?
Cite uma situação em que o uso do Pinia (Gerenciamento de Estado Global) é preferível em relação ao uso de Props e Events. O que é o problema do "Prop Drilling"?
2. Criando uma Store
Crie uma store chamada useCounterStore usando o estilo Setup Store.
- Defina um state (ref) chamado count.
- Defina uma action (function) chamada increment.
- Defina um getter (computed) chamado doubleCount que retorna o dobro do valor atual.
3. Consumindo a Store
Importe a store criada acima em um componente Vue. Exiba o valor de count e de doubleCount no template. Chame a action increment ao clicar em um botão.
4. Persistência de Estado
Como você faria para que os dados de uma Store do Pinia não fossem perdidos quando o usuário atualiza (F5) a página? Cite uma estratégia ou plugin que ajude nisso.
5. Desafio: Lista de Compras Global
Crie uma useCartStore que gerencie um array de produtos no carrinho.
- Crie uma action para adicionar um produto ao array.
- Crie um getter que calcule o valor total do carrinho (soma dos preços).
- Crie dois componentes diferentes na página: um que adiciona itens e outro que exibe apenas o total acumulado, provando que ambos compartilham o mesmo estado.
Exercícios: Aula 12 - Projeto Prático II: CRUD (Estrutura) 💾
1. Planejando o CRUD
Para um sistema de Gerenciamento de Produtos, quais são os 4 componentes visuais principais que você criaria para representar as ações de Criar, Ler, Atualizar e Deletar?
2. Verbos HTTP vs CRUD
Relacione as ações do CRUD com os verbos HTTP correspondentes: - Criar novo produto -> ? - Listar produtos -> ? - Atualizar produto existente -> ? - Deletar produto -> ?
3. Mockando a API
Utilize o site JSON Server ou uma ferramenta similar para simular uma API REST local. Crie um arquivo db.json com uma lista inicial de produtos contendo id, nome e preco.
4. Tratamento de Erros Profissional
No script de uma action que realiza um axios.post, como você trataria um erro de validação enviado pelo servidor (ex: Status 400)? Como você exibiria esse erro para o usuário final de forma amigável?
5. Desafio: Formulário de Edição
Crie um componente FormularioProduto.vue que sirva tanto para Criar quanto para Editar.
- Ele deve receber um objeto produto opcional via prop.
- Se a prop estiver presente, preencha os inputs com os dados (Edição).
- Se não estiver, os campos devem começar vazios (Criação).
- Ao salvar, o componente deve emitir um evento para o pai ou chamar a action da store correspondente.
Exercícios: Aula 13 - Boas Práticas e Arquitetura 🏛️
1. Refatoração de Componentes
Pegue um componente que você criou nos exercícios anteriores que possua mais de 100 linhas. Tente identificar uma parte da interface que se repete ou que possui uma lógica independente e extraia-a para um novo componente menor. Quais os ganhos obtidos?
2. Criando um Composable
Crie um Composable chamado useToggle.js.
- Ele deve retornar uma variável reativa isOpen (boolean) e uma função toggle que inverta esse valor.
- Importe e use esse composable em dois componentes diferentes para controlar a visibilidade de um modal ou menu.
3. Organização de Pastas
Descreva como você organizaria as pastas de um projeto Vue que possui: - 20 Componentes globais (botão, input, etc). - 5 Páginas principais. - 3 Stores do Pinia. - 10 Ícones SVG. - 1 arquivo de configuração de rotas.
4. Boas Práticas de Props
Por que não devemos alterar o valor de uma Prop diretamente dentro do componente filho? Se precisarmos mudar esse valor, qual técnica (padrão) devemos seguir?
5. Desafio: Documentação de Componente
Escolha o componente mais complexo que você criou neste curso. Escreva um pequeno arquivo README.md (dentro da pasta do componente) explicando quais Props ele recebe, quais Eventos ele emite e qual a sua responsabilidade principal.
Exercícios: Aula 14 - Estilização Moderna 🎨
1. CSS Scoped e Global
Crie um componente que tenha um parágrafo personalizado com uma cor rosa usando <style scoped>. Logo abaixo, crie um parágrafo normal em App.vue. Verifique se o parágrafo do App também ficou rosa. Explique o resultado.
2. Introdução ao Tailwind (Conceitual)
Transforme o seguinte CSS tradicional em classes utilitárias do Tailwind CSS:
.meu-botao {
background-color: #3b82f6;
border-radius: 0.5rem;
padding: 0.5rem 1rem;
color: white;
font-weight: bold;
}
3. Classes Dinâmicas
Crie uma lista de alertas. Cada alerta pode ser do tipo "sucesso", "erro" ou "aviso". Use a diretiva :class para mudar a cor de fundo do alerta com base no seu tipo.
4. Variáveis Reativas no CSS
No Vue 3, use o v-bind() dentro da tag <style> para que a largura de uma barra de progresso seja controlada por uma variável reativa do JavaScript.
width: v-bind(porcentagem + '%');
5. Desafio: Dark Mode Simples
Crie um botão de "Alternar Tema".
- Ao clicar, ele deve adicionar ou remover a classe .dark na tag principal do app ou no body.
- Defina variáveis CSS para cor de fundo e cor de texto que mudam quando a classe .dark está ativa.
- Use transições CSS para que a mudança de cores seja suave.
Exercícios: Aula 15 - Build, Deploy e Produção 🚢
1. Scripts do NPM
Abra o arquivo package.json. Explique o que cada um dos comandos abaixo faz:
- npm run dev
- npm run build
- npm run preview
2. O Processo de Build
Execute npm run build no seu projeto. Abra a pasta dist/ que foi gerada. O que aconteceu com seus arquivos .vue? Eles ainda existem nesse formato na pasta final?
3. Variáveis de Ambiente
Crie um arquivo .env e defina uma variável VITE_API_URL. Como você acessa esse valor dentro de um componente Vue ou arquivo JS no Vite? Por que não devemos salvar senhas reais nesse arquivo?
4. Preparando para o Deploy
Escolha um serviço de hospedagem gratuito (Vercel ou Netlify). Conecte seu repositório do GitHub e realize o primeiro deploy. Coloque o link do seu site no ar aqui.
5. Desafio: Auditoria com Lighthouse
Abra o seu site publicado no Google Chrome. Vá em "Inspecionar" -> "Lighthouse" e gere um relatório de performance. Identifique um ponto de melhoria sugerido pela ferramenta para o seu projeto Vue.
Exercícios: Aula 16 - Projeto Final: Kanban System 🎓
1. Checklist de Requisitos
Leia os requisitos do Projeto Final na Aula 16. Liste quais as 3 funcionalidades você considera as mais desafiadoras de implementar e por quê.
2. Arquitetura da Store de Tarefas
Desenhe a estrutura da Store do Pinia para o Kanban. Quais propriedades o objeto de tarefa deve ter para que o sistema saiba em qual coluna (To Do, Doing, Done) a tarefa se encontra?
3. Planejamento de Layout
Faça um rascunho (pode ser no papel ou ferramenta de desenho) de como as 3 colunas serão exibidas em telas de computador (desktop) e como elas devem se comportar em telas de celular (mobile). Utilize conceitos de Flexbox ou CSS Grid.
4. Feedback ao Usuário
Como você notificaria o usuário de que uma tarefa foi criada, movida ou excluída com sucesso? (Ex: Toasts, Modais, Alertas). Cite uma biblioteca que ajude com isso.
5. Desafio Final: Estrutura do Repositório
Crie o repositório final do projeto no GitHub. Organize as pastas iniciais, configure o Vue Router e o Pinia. Crie os componentes "casca" para as colunas e para o Header. Realize o primeiro git commit com o título "Initial project structure".
Projetos
Projetos Práticos 🚀
Transforme teoria em prática com desafios progressivos que compõem seu portfólio.
-
Fase 1: Fundamentos ---
-
Fase 2: Componentização ---
-
Fase 3: Ecossistema & Estado ---
-
Fase 4: Profissional ---
Projeto 01 - Setup e Primeiro Componente 🚀
🎯 Objetivo
Configurar o ambiente de desenvolvimento e criar a estrutura inicial da sua primeira aplicação Vue 3 utilizando o Vite.
🛠️ Requisitos
- Instalação: Certifique-se de ter o Node.js instalado.
- Bootstrap: Inicie um projeto usando o comando
npm create vite@latest. - Configuração:
- Nome do projeto:
meu-primeiro-vue - Framework:
Vue - Variante:
JavaScript
- Nome do projeto:
- Limpeza: Remova os arquivos de exemplo gerados pelo Vite (
HelloWorld.vue, estilos padrão emApp.vue).
🏗️ Tarefas
- No arquivo
App.vue, crie uma estrutura básica de HTML usando as tags<template>,<script setup>e<style>. - Exiba uma mensagem de boas-vindas em um
<h1>. - Adicione um parágrafo descrevendo qual o seu objetivo com este curso de Vue.js.
- Aplique um estilo CSS simples (cor de fundo e fonte) no bloco
<style>.
🧪 Verificação
Rode o comando npm run dev e verifique se o seu projeto está rodando em localhost:5173 com as informações que você escreveu.
Projeto 02 - Layout e Estrutura Estática 🏗️
🎯 Objetivo
Organizar a estrutura visual de uma página utilizando as pastas e padrões de um projeto profissional em Vue.
🛠️ Requisitos
- Utilizar o projeto criado na aula anterior.
- Respeitar a divisão de pastas:
src/assetspara estilos esrc/componentspara as peças da interface.
🏗️ Tarefas
- CSS Global: Crie um arquivo
src/assets/main.csscom um reset básico (margin: 0, padding: 0) e importe-o no seumain.js. - Header: Crie um componente
Header.vuena pasta components que contenha o nome "Meu Portal Vue" e um menu simples (Home, Sobre). - Footer: Crie um componente
Footer.vuecom os créditos: "Desenvolvido por [Seu Nome] - 2026". - Assemble: Importe e exiba o
Headere oFooterdentro do seuApp.vue.
🧪 Verificação
O site deve exibir uma barra no topo, um espaço no meio (conteúdo do App) e uma barra no rodapé, sem espaços em branco nas bordas da tela.
Macro Syntax Error
File: projetos/projeto-03.md
Line 8 in Markdown file: Expected an expression, got 'end of print statement'
Projeto 04 - Lista Dinâmica (Diretivas) 📜
🎯 Objetivo
Dominar o controle de fluxo no template utilizando as diretivas v-if, v-for e @click.
🛠️ Requisitos
- Listagem dinâmica de dados.
- Modificadores de evento.
🏗️ Tarefas
- Lista de Frutas: Crie um array reativo de strings com nomes de frutas.
- Renderização: Utilize o
v-forpara mostrar a lista na tela. Use o index como:key. - Adicionar: Crie um input e um botão para que o usuário possa digitar uma nova fruta e adicioná-la à lista ao clicar ou apertar Enter (
@keyup.enter). - Condicional: Se a lista estiver vazia (adicione um botão "Limpar Tudo"), exiba a mensagem: "Nenhuma fruta encontrada. 🧺".
🧪 Verificação
Teste adicionar 3 frutas, verifique se elas aparecem. Limpe a lista e veja se o aviso de lista vazia aparece conforme o esperado.
Projeto 05 - Componentização e Props 🧩
🎯 Objetivo
Quebrar uma interface monolítica em pequenos componentes reutilizáveis, utilizando Props para transferência de dados.
🛠️ Requisitos
- Divisão em múltiplos arquivos
.vue. - Validação de Props no componente filho.
🏗️ Tarefas
- Componente Base: Crie um componente
MeuBotao.vueque aceite as propstexto(obrigatória) ecor(opcional, com valor padrão). - Componente de Card: Crie um
CardProduto.vueque receba um objeto produto (id, nome, preco) e um botão do item 1. - App: No
App.vue, renderize uma lista de 3 produtos diferentes utilizando oCardProduto. - Estilização: Utilize o atributo
scopedpara garantir que o estilo de um card não afete o outro.
🧪 Verificação
Verifique se os cards aparecem de forma independente e se os botões exibem o texto correto enviado pelo componente pai.
Projeto 06 - Eventos e Comunicação 📡
🎯 Objetivo
Estabelecer a comunicação de "baixo para cima" (filho para pai) utilizando defineEmits.
🛠️ Requisitos
- Uso de
defineEmitsno componente filho. - Captura de eventos com
@no componente pai.
🏗️ Tarefas
- Filho: Crie um componente
TecladoNumerico.vuecom botões de 1 a 9. - Ação: Ao clicar em qualquer número, o componente deve disparar um evento
clique-numeroenviando o valor pressionado como conteúdo (payload). - Pai: No
App.vue, receba esses números e vá concatenando-os em uma variávelresultadopara formar um número de telefone. - Botão Limpar: O pai deve ter um botão para resetar a variável.
🧪 Verificação
Digite uma sequência de números no teclado e verifique se o número completo está sendo montado corretamente na tela do componente pai.
Projeto 07 - Ciclo de Vida e Hooks 🔄
🎯 Objetivo
Utilizar os estágios de vida de um componente para gerenciar recursos do sistema e chamadas externas.
🛠️ Requisitos
- Uso de
onMountedeonUnmounted.
🏗️ Tarefas
- Relógio Reativo: Crie um componente que exiba as horas atuais.
- Montagem: No
onMounted, inicie umsetIntervalque atualiza a hora a cada segundo. - Limpeza: No
onUnmounted, limpe o intervalo para evitar que ele continue rodando na memória após o componente ser destruído. - Toggle: No
App.vue, crie um botão "Mostrar/Esconder Relógio" para testar se a limpeza está funcionando (verifique via logs no console).
🧪 Verificação
Abra o console do navegador. O relógio deve atualizar a cada segundo. Clique em esconder e verifique se as atualizações no console param imediatamente.
Projeto Prático I - Task Manager App 📝
🎯 Objetivo
Construir uma aplicação real de gerenciamento de tarefas, consolidando os conhecimentos de componentes, props, eventos e persistência.
🛠️ Requisitos
- Componentização completa (Form, List, Item).
- Persistência no
localStorage. - Estilização agradável.
🏗️ Tarefas
- Estrutura: Crie o componente
TaskFormpara entrada eTaskItempara exibição. - Lista: O componente Pai (
App.vue) deve manter o array de objetos de tarefas. - Funcionalidades:
- Adicionar tarefa.
- Marcar como concluída (visual riscado).
- Deletar tarefa da lista.
- Persistência: Ao carregar, verifique o LocalStorage. Ao mudar a lista, salve no LocalStorage.
🧪 Verificação
Feche o navegador e abra novamente. Suas tarefas devem continuar aparecendo na tela exatamente como você as deixou.
Projeto 09 - Roteamento com Vue Router 🛣️
🎯 Objetivo
Transformar sua aplicação em uma SPA (Single Page Application) com múltiplas visualizações e navegação entre elas.
🛠️ Requisitos
- Instalação e configuração do
vue-router. - Uso de
router-linkerouter-view.
🏗️ Tarefas
- Setup: Instale o Vue Router e crie o arquivo
src/router/index.js. - Vistas: Crie as pastas
src/viewse adicione os componentesHome.vueeSobre.vue. - Navegação: No
App.vue, remova o conteúdo central e coloque a tag<router-view />. Crie links de navegação usando<router-link>. - Parâmetros: Crie uma rota
/usuario/:idque exiba o ID passado na URL dentro da página.
🧪 Verificação
Clique nos links do menu. A URL deve mudar e o conteúdo no centro da página deve alternar sem que o navegador realize um refresh completo.
Projeto 10 - Consumo de API REST 🌐
🎯 Objetivo
Integrar o frontend com um serviço externo de dados utilizando o Axios.
🛠️ Requisitos
- Instalação do
axios. - Chamadas assíncronas com
async/await.
🏗️ Tarefas
- Instalação: Instale o axios e crie uma instância de API apontando para
https://jsonplaceholder.typicode.com. - Lista de Usuários: No
onMountedde um componente, busque a lista de usuários (/users). - Renderização: Mostre o nome e o e-mail de cada usuário em uma lista.
- Loading: Exiba um texto "Carregando..." enquanto os dados não chegam e trate possíveis erros com
try/catch.
🧪 Verificação
Ao entrar na página, você deve visualizar a lista real de usuários vinda da API externa.
Projeto 11 - Gerenciamento de Estado (Pinia) 🍍
🎯 Objetivo
Centralizar o estado de informações importantes da aplicação para que elas sejam acessíveis em qualquer tela.
🛠️ Requisitos
- Configuração do
Pinia. - Criação de uma Store (State, Actions).
🏗️ Tarefas
- Setup: Configure o Pinia no
main.js. - Store de Perfil: Crie uma store
useUserStoreque guarde o nome do usuário logado. - Ação: Crie uma função na store para atualizar o nome.
- Uso: Exiba o nome do usuário no
Header(vindo da store) e crie uma página de "Configurações" onde o usuário possa mudar seu nome.
🧪 Verificação
Mude o nome na página de configurações e verifique se o nome no cabeçalho (Header) atualiza instantaneamente em todas as rotas.
Projeto Prático II - CRUD System 💾
🎯 Objetivo
Desenvolver um sistema completo de Gerenciamento de Produtos, aplicando roteamento, consumo de API e estado global.
🛠️ Requisitos
- Rotas para Listagem, Criação e Edição.
- Uso de Axios para persistir dados (use o JSON-Server se desejar).
- Pinia para gerenciar a lista de produtos em cache.
🏗️ Tarefas
- Listagem: Crie uma tela que liste todos os produtos com botões de "Editar" e "Excluir".
- Cadastro: Crie um formulário que envie um POST para a API para criar novos produtos.
- Edição: Ao clicar em editar, leve o usuário para uma rota
/editar/:id, carregue os dados e permita o salvamento via PUT. - Exclusão: Ao clicar em excluir, envie o DELETE e atualize a lista na tela.
🧪 Verificação
Realize o fluxo completo: Crie um produto, edite o nome dele, e por fim, exclua-o da lista. Verifique se todas as requisições na aba "Network" do navegador foram bem-sucedidas.
Projeto 13 - Composables e Clean Code 🏛️
🎯 Objetivo
Melhorar a organização do código extraindo lógicas complexas para funções reusáveis (Composables).
🛠️ Requisitos
- Criação de um Composable customizado.
- Refatoração de um componente existente.
🏗️ Tarefas
- useFetch: Crie um composable chamado
useFetchque receba uma URL e retorne{ data, error, loading }. - Encapsulamento: Toda a lógica de
try/catche estados de loading devem ficar dentro do composable. - Refatoração: Escolha um componente que faça chamadas de API e substitua o código original pelo uso do seu novo
useFetch. - Reuso: Utilize o mesmo composable em um segundo componente para provar que a lógica é genérica.
🧪 Verificação
O componente deve continuar funcionando exatamente como antes, mas o código dentro dele deve estar muito mais limpo e focado apenas na interface.
Projeto 14 - Estilização Moderna (Tailwind) 🎨
🎯 Objetivo
Implementar uma interface profissional e moderna utilizando as classes utilitárias do Tailwind CSS.
🛠️ Requisitos
- Configuração do Tailwind CSS no projeto.
- Design responsivo.
🏗️ Tarefas
- Setup: Instale e configure o Tailwind no seu projeto Vite.
- Login Screen: Crie uma tela de Login bonita e centralizada.
- Estilos: Use bordas arredondadas, sombras (
shadow-md), efeitos de hover nos botões e um fundo suave. - Responsividade: Garanta que o formulário ocupe a largura total no celular e tenha uma largura fixa em telas maiores.
🧪 Verificação
Abra o site e verifique se o layout está alinhado e se os botões e campos possuem o visual "premium" proporcionado pelo Tailwind.
Projeto 15 - Build e Deploy 🚢
🎯 Objetivo
Transformar seu código fonte em um site real e acessível por qualquer pessoa na internet.
🛠️ Requisitos
- Processo de build via Vite.
- Hosting em plataforma Jamstack.
🏗️ Tarefas
- Build: Execute
npm run builde explore a pastadist/. - Environment: Crie um arquivo
.envpara suas chaves de API. - Deploy: Suba seu projeto para o GitHub e conecte-o ao Netlify ou Vercel.
- Auditoria: Rode o Lighthouse do Google Chrome no site já publicado e identifique melhorias de performance.
🧪 Verificação
Envie o link do seu site no ar para um colega ou abra no seu celular para testar o acesso externo.
Projeto Final - Kanban System 🎓
🎯 Objetivo
Construir uma aplicação avançada de produtividade aplicando TODO o conhecimento adquirido no curso.
🛠️ Requisitos
- Sistema de colunas (To-Do, Doing, Done).
- Drag and Drop para movimentação de tarefas.
- Persistência total (Pinia + LocalStorage).
- UI profissional com Tailwind.
🏗️ Tarefas
- Planejamento: Defina a estrutura da sua store do Pinia para gerenciar as tarefas por status.
- Interface: Crie as 3 colunas e o formulário para adicionar novas tarefas.
- Movimentação: Implemente a lógica para mudar o status de uma tarefa ao ser movida.
- Filtros: Adicione uma busca rápida no topo para filtrar tarefas pelo título.
- Finalização: Realize o deploy e documente o projeto em um README caprichado.
🧪 Verificação
Mova uma tarefa da coluna "To-Do" para "Done", atualize a página e verifique se ela permanece na coluna correta.
Quizzes
Quizzes Interativos 🧠
Teste seus conhecimentos rapidamente ao final de cada módulo.
-
Fase 1 ---
-
Fase 2 ---
-
Fase 3 ---
-
Fase 4 ---
Quiz 01 - Introdução
Quiz 02 - Introdução
Quiz 03 - Introdução
Quiz 04 - Introdução
Quiz 05 - Introdução
Quiz 06 - Introdução
Quiz 07 - Introdução
Quiz 08 - Introdução
Quiz 09 - Introdução
Quiz 10 - Introdução
Quiz 11 - Introdução
Quiz 12 - Introdução
Quiz 13 - Introdução
Quiz 14 - Introdução
Quiz 15 - Introdução
Quiz 16 - Introdução
Slides
Slides 📺
Material visual para acompanhamento das vídeo-aulas.
-
Módulo 1 ---
-
Módulo 2 ---
-
Módulo 3 ---
-
Módulo 4 ---
Aula 01 - Introdução a Microsserviços 🌐
De Monólitos a Sistemas Distribuídos
Agenda de Hoje 📅
- Panorama do Software Moderno
- Monólitos vs Microsserviços
- A Economia das APIs
- Escalabilidade Vertical vs Horizontal
- Cinto de Utilidades (Ferramentas)
- Setup do Ambiente
1. O Mundo Cloud-Native ☁️
- Sistemas globais exigem disponibilidade 24/7.
- Milhões de requisições por segundo.
- Deploy contínuo (várias vezes ao dia).
2. A Evolução da Arquitetura 🏛️➡️🏗️
2.1 O Monólito 🏛️
- Um único projeto, um único deploy.
- Tudo ou nada: erro em um lugar afeta tudo.
- Difícil de escalar partes específicas.
- Ideal para: Projetos pequenos, MVPs rápidos.
2.2 Microsserviços 🏗️
- Conjunto de serviços independentes.
- Comunicação via rede (APIs).
- Cada um com seu banco de dados.
- Ideal para: Sistemas complexos e escaláveis.
3. O Papel das APIs 📡
- Contract-First: Acordo de comunicação.
- REST como padrão dominante.
- JSON: A língua universal.
Escalabilidade: Vertical vs Horizontal
| Vertical (Scale Up) | Horizontal (Scale Out) |
|---|---|
| Aumenta CPU/RAM | Adiciona mais servidores |
| Tem limite físico | Virtualmente ilimitada |
| Causa downtime no upgrade | Zero downtime (Redundância) |
Arquitetura de Microsserviços
graph LR
User[Cliente] --> AGW[API Gateway]
AGW --> S1[Usuários]
AGW --> S2[Pedidos]
AGW --> S3[Pagamentos]
S1 --> DB1[(DB)]
S2 --> DB2[(DB)]
S3 --> DB3[(DB)]
4. Ferramentas Indispensáveis 🛠️
Client HTTP: Postman & Insomnia
- Testar rotas sem Frontend.
- Analisar Headers e Status Codes.
- Simular diferentes cenários de erro.
Containerização: Docker 🐋
- "Roda na minha máquina, roda em qualquer lugar".
- Isola dependências e versões.
- Facilita a subida de múltiplos serviços locais.
5. Estrutura de Projeto Backend 📂
- Divisão clara de responsabilidades.
- Controllers, Services e Repositories.
- Tratamento global de exceções.
6. Setup do Ambiente 🚀
Requisitos:
- IDE: VS Code ou IntelliJ.
- Postman (Desktop ou Extensão).
- Docker Desktop.
- Git & GitHub.
Resumo da Aula ✅
- Microsserviços trazem resiliência e escala.
- APIs são o coração da comunicação moderna.
- Ferramentas como Docker mudaram o jogo.
- Começamos nossa jornada Fullstack!
Próxima Aula: Arquitetura e Gateway 🏗️
- Como os serviços conversam?
- O que é Service Discovery?
- Protegendo a porta de entrada.
Dúvidas? 🤔
"A arquitetura de hoje é o legado de amanhã. Escolha com sabedoria."
Aula 02 - Arquitetura e Gateway 🏗️
Orquestrando Microsserviços
Agenda 📅
- Comunicação entre Serviços
- Síncrono vs Assíncrono
- O Papel do API Gateway
- Service Discovery
- Load Balancing
- Padrões de Resiliência
1. Como os Serviços Conversam? 💬
- Microsserviços são ilhas que precisam de pontes.
- Dois mundos: Sync e Async.
1.1 Comunicação Síncrona 🔄
- Cliente bloqueia até a resposta.
- Uso de HTTP/REST ou gRPC.
- Risco: Acoplamento temporal e gargalos.
1.2 Comunicação Assíncrona 📬
- Envia e esquece (Eventos).
- Uso de Filas e Tópicos (Broker).
- Vantagem: Escalabilidade e desacoplamento.
2. API Gateway: O Porteiro 🚪
- Única entrada para o mundo exterior.
- Esconde a complexidade interna.
Gateway Responsibilities
- Roteamento:
/p-> Pagamento,/e-> Estoque. - Segurança: Autenticação centralizada.
- Rate Limit: Proteção contra flood.
- Logs & Monitoramento.
3. Service Discovery 🔎
- Onde está o servidor de pagamentos?
- Agenda dinâmica de IPs e Portas.
- Ferramentas: Netflix Eureka, Consul.
4. Load Balancing ⚖️
- Distribuição inteligente da carga.
- Evita que um container "morra" de trabalho.
graph TD
GW[Gateway] --> LB[Load Balancer]
LB --> S1[Serviço A]
LB --> S2[Serviço B]
LB --> S3[Serviço C]
5. Resiliência: Circuit Breaker 🔌
- Detecta serviços lentos ou falhos.
- Abre o circuito para proteger o resto do sistema.
- Evita o cascateamento de erros.
Comparativo: Sync vs Async
| Característica | Síncrono 🔄 | Assíncrono 📬 |
|---|---|---|
| Resposta | Imediata | Eventual |
| Desempenho | Limitado pelo destino | Alto débito |
| Uso comum | Cadastro/Login | Geração de Relatórios |
6. Prática: O "Dashboard" Agregador 💻
- Como o Gateway une dados de 3 serviços?
- Agregação de respostas (Aggregation Pattern).
Desafio Relâmpago ⚡
O que acontece se o seu API Gateway cair? Ele é um ponto único de falha?
Resumo ✅
- Sync é fácil, Async é escalável.
- API Gateway protege e organiza.
- Service Discovery é essencial em containers.
- Resiliência não é opcional!
Próxima Aula: Modelagem REST 📡
- Verbos HTTP.
- Status Codes.
- O contrato ideal.
Dúvidas? 🏗️
Aula 03 - Modelagem de APIs RESTful 📡
Recursos, Verbos e Contratos
Agenda 📅
- O que é REST?
- Recursos e URIs
- Verbos HTTP (GET, POST, PUT...)
- Status Codes
- JSON: A Linguagem das APIs
- Boas Práticas de Design
1. REST: A "Língua" da Web 🌐
- Style arquitetural para sistemas distribuídos.
- Baseado no protocolo HTTP.
- Independência entre Client e Server.
Princípios REST
- Stateless: Cada requisição é única.
- Uniform Interface: Padrões compartilhados.
- Cacheable: Melhore a performance.
2. Identificando Recursos 📍
- Um recurso é qualquer coisa que expomos.
- URI: O endereço do recurso.
O que NÃO fazer:
GET /obterUsuarios ❌
O que fazer:
GET /usuarios ✅ (Sempre substantivos no plural!)
3. Os Verbos HTTP 🛠️
Eles definem a intenção da chamada:
- GET: Buscar dados.
- POST: Criar novo dado.
- PUT: Atualizar (Trocar tudo).
- PATCH: Atualizar (Apenas um pedaço).
- DELETE: Remover dado.
Idempotência e Segurança
| Verbo | Seguro? | Idempotente? |
|---|---|---|
| GET | Sim ✅ | Sim ✅ |
| POST | Não ❌ | Não ❌ |
| PUT | Não ❌ | Sim ✅ |
| DELETE | Não ❌ | Sim ✅ |
4. Status Codes: A Resposta 🚦
- 2xx: Deu certo! (200, 201, 204).
- 4xx: Você (cliente) errou algo (400, 401, 404).
- 5xx: Eu (servidor) quebrei (500, 503).
5. O Formato JSON 🏗️
- Leve, legível e universal.
6. Design de URIs Complexas
Como buscar os pedidos de um usuário específico?
GET /usuarios/123/pedidos ✅
- Hierarquia lógica e limpa.
7. Prática: Postman em Ação 💻
- Testando verbos em APIs reais.
- Analisando Headers e Body.
Desafio REST ⚡
Se você quer mudar apenas o e-mail de um usuário, qual verbo deve usar: PUT ou PATCH?
Resumo ✅
- REST é sobre recursos e padrões.
- URIs usam substantivos no plural.
- Status codes guiam o frontend.
- JSON é o padrão de facto.
Próxima Aula: Swagger e Mocks 📝
- Documentação automática.
- Como trabalhar sem o backend pronto?
Dúvidas? 📡
Aula 04 - Documentação e Mocks 📝
Developer Experience e Contratos
Agenda 📅
- Por que documentar?
- OpenAPI vs Swagger
- Swagger UI e Editor
- O Poder dos Mocks
- Developer Experience (DX)
- Ferramentas de Simulação
1. Documentação é DX 🚀
- Sua API é seu produto.
- Documentar economiza tempo de suporte.
- Facilita a integração com Front/Mobile.
2. OpenAPI (OAS) 📜
- O padrão mundial.
- Arquivo YAML ou JSON descritivo.
- Agnóstico de linguagem.
3. Swagger: O Canivete Suíço 🛠️
- Editor: Escreva e valide o contrato.
- UI: Gere a página visual de testes.
- Codegen: Gere código (client/server) automaticamente.
Swagger UI em Ação
- Permite testar endpoints no próprio navegador.
- Mostra exemplos de JSON de entrada e saída.
- Exibe todos os Status Codes possíveis.
4. O Poder dos Mocks 🎭
- Development in Parallel: Front não espera pelo Back.
- Servidor "Fake" que retorna dados reais.
- Valide a experiência antes da implementação complexa.
5. Developer Experience (DX) 👨💻
Como ser amado por outros devs:
- Nomes de rotas claros.
- Erros descritivos no Body.
- Exemplos de requisição.
- Documentação atualizada (ou gerada pelo código).
6. Ferramentas Recomendadas 🧰
- Swagger Editor: Online ou Local.
- Mockoon: Mock local amigável.
- Prism: Mock via CLI.
- Postman: Collections documentadas.
7. Prática: Editando um YAML 💻
- Desenhando um endpoint
GET /tarefas. - Definindo parâmetros de entrada.
- Criando esquemas de dados.
Desafio: Mock vs Stubs ⚡
Qual a principal vantagem de um Mock Server online (como Postman) em relação a um Mock rodando apenas no computador do desenvolvedor?
Resumo ✅
- OpenAPI é o contrato.
- Swagger UI é a vitrine da sua API.
- Mocks destravam o desenvolvimento da equipe.
- DX é o diferencial de uma boa API.
Próxima Aula: Implementação Backend! 💻
Módulo 2: Manipulação de Dados
- Controllers e Services.
- Repositories e Banco de Dados.
- Mão na massa com código real!
Dúvidas? 📝
Aula 05 - Implementação de APIs ⚙️
Controllers e Rotas
Agenda 📅
- Camadas do Backend
- O Papel do Controller
- Rotas e Handlers
- Capturando Dados (Params/Body)
- Status Codes na Prática
- Injeção de Dependência
1. Organização em Camadas 🧱
- Controller: Trata a entrada (HTTP).
- Service: Regras de negócio.
- Repository: Acesso ao banco.
2. O Papel do Controller 🎮
- Ele é o ponto de entrada.
- Não deve ter lógica complexa!
- Deve apenas orquestrar a execução.
Controller = Garçom 🤵 Service = Cozinheiro 👨🍳
3. Rotas e Handlers 📍
- Rota: Verbo HTTP + Path.
- Handler: Função executada.
4. Capturando Dados 📥
- Path Params:
/id/123(Identificação). - Query Params:
?q=busca(Filtro). - Body: Enviando JSON (Criação/Update).
5. Respostas de Qualidade 📤
- Nunca esqueça o Status Code!
- Sucesso: 200, 201, 204.
- Erro: 400, 401, 404, 500.
6. Injeção de Dependência 💉
- Receber serviços prontos.
- Facilita testar o Controller "isolado".
7. Prática: O Primeiro Endpoint 💻
- Mapeando um
GET /ping. - Retornando um
pongem JSON. - Testando no Insomnia/Postman.
Desafio: Params vs Query ⚡
Se você quer listar todos os alunos de uma sala com o nome "Pedro", qual tipo de parâmetro você usaria para o nome?
Resumo ✅
- Controllers são a porta de entrada.
- Devem ser leves e objetivos.
- Capturam dados e retornam status/JSON.
- Seguem as rotas definidas.
Próxima Aula: Regras de Negócio! 🧠
Services e Validações
- Onde o cálculo acontece.
- Isolando o código do "mundo externo".
Dúvidas? ⚙️
Aula 06 - Services e Regras de Negócio 🧠
O Cérebro da Aplicação
Agenda 📅
- Por que separar as coisas?
- Responsabilidades do Service
- O Fluxo: Controller -> Service
- Tratamento de Erros Profissional
- DTOs: Protegendo os Dados
- Service vs ViewModel (Mobile)
1. O Problema: "Controller Gordo" 🍔
- Lógica de negócio misturada com HTTP.
- Código impossível de reutilizar.
- Difícil de testar.
2. A Solução: Layered Architecture 🧱
- Controller: Trata o transporte (HTTP).
- Service: Trata a regra (O QUE fazer).
3. O que vai no Service? ⚖️
- Validações complexas.
- Cálculos de valores.
- Envio de e-mails/notificações.
- Integração com repositórios.
4. Tratamento de Erros ⚠️
- O Service Lança (Throws).
- O Controller Captura (Catches).
// Service
if (!saldo) throw new Error("Saldo Insuficiente");
// Controller
try { ... } catch (e) { res.status(400)... }
5. DTOs: Filtrando a Saída 📦
- Nunca envie "tudo" do banco para o cliente.
- Proteja campos sensíveis (Ex:
senha_hash). - Melhore a performance (menos dados trafegados).
6. Service vs ViewModel 🆚
- No Backend: Service é o cérebro.
- No Mobile/Front: ViewModel é o cérebro.
- Ambos servem para "limpar" a camada de visualização.
7. Prática: Validando um Cadastro 💻
- Verificando se o e-mail é válido.
- Verificando se o usuário já existe.
- Lançando erros específicos.
Desafio: Onde colocar? ⚡
Se uma regra diz: "Usuários VIP ganham 20% de desconto", essa regra deve ficar no Controller ou no Service?
Resumo ✅
- Controllers recebem, Services processam.
- Mantenha seus Controllers "finos" (Slim Controllers).
- Centralize as regras para facilitar a manutenção.
- DTOs são as fronteiras dos dados.
Próxima Aula: Onde os dados vivem! 🗄️
Repositories e Banco de Dados
- PostgreSQL e SQL básico.
- Camada de persistência.
Dúvidas? 🧠
Aula 07 - Repositories e Banco de Dados 🗄️
Onde a informação descansa
Agenda 📅
- Por que Bancos de Dados?
- PostgreSQL: O Robusto
- SQL Básico (SELECT, INSERT...)
- Relacionamentos (1:N, N:N)
- Camada de Persistence
- O Padrão Repository
1. Persistência de Dados 💾
- Sem banco, o servidor esquece tudo ao reiniciar.
- Precisamos de segurança e integridade.
- Estritamente Tipado: O banco garante o formato.
2. Por que PostgreSQL? 🐘
- Código Aberto (Open Source).
- Extremamente confiável (ACID).
- Suporta dados complexos (JSONB).
3. SQL: A Linguagem Universal 🗣️
- DDL: Define a estrutura (Tabelas).
- DML: Manipula os dados (Linhas).
4. O Coração: Relacionamentos 🔗
- 1:N: Um cliente, muitos pedidos.
- N:N: Muitos alunos, muitos cursos.
- Foreign Key: A âncora que liga tudo.
5. Camada de Persistence 🧱
- O código que conversa com o driver do banco.
- Onde as queries são traduzidas para o código.
6. Padrão Repository 📥
- "Não me diga como, diga O QUE você quer".
- Isola o SQL da regra de negócio.
7. Migrations 📜
- Controle de versão para o Banco.
- Permite "voltar no tempo" se algo quebrar.
- Mantém o time em sincronia.
Desafio SQL ⚡
Qual comando você usaria para mudar o preço de todos os produtos da categoria 'Games' para 99.90?
Resumo ✅
- Bancos de dados dão memória ao sistema.
- PostgreSQL é o padrão da indústria.
- SQL é habilidade obrigatória para backend.
- Repository Pattern traz flexibilidade.
Próxima Aula: Integridade! ✅
Validação e Boas Práticas
- Garantindo que dados "sujos" não entrem no banco.
- Tratamento de exceções de banco.
Dúvidas? 🗄️
Aula 08 - Boas Práticas e Validação ✅
Qualidade e Segurança no Backend
Agenda 📅
- Por que Validar Tudo?
- Validação vs Sanitização
- Schema Validation (Ex: Zod)
- Clean Code (Código Limpo)
- Tratamento de Erros Profissional
- Middlewares Globais
1. Regra de Ouro: Desconfiança 🛡️
- O cliente é o "lado perigoso" da aplicação.
- Validações evitam dados corrompidos.
- Defesa em Profundidade: Garanta a regra no banco E no código.
2. Validar vs Sanitizar 🧼
- Validar: Checar (Idade > 18?).
- Sanitizar: Limpar (Remover
<script>).
3. Schema Validation 📐
- Crie "moldes" para seus dados.
- Validação centralizada e reutilizável.
4. O Backend Elegante (Clean Code) ✨
- DRY: Don't Repeat Yourself (Não repita lógica).
- KISS: Keep It Simple, Stupid (Mantenha o simples).
- Nomes de funções que explicam o que está acontecendo.
5. Tratamento de Erros 🚨
- Controller trata o fluxo, não o detalhe técnico.
- Try/Catch Global: Evite crashes.
- Mensagens amigáveis para o cliente.
6. Logs vs Mensagens 📜
- Terminal/Log: Detalhe técnico completo.
- Cliente (JSON): Apenas o que ele precisa saber.
"Ocorreu um erro interno" (Cliente) ✅ "Query failed at line 42 due to NULL constraint" (Logs) ✅
7. Prática: O Schema Perfeito 💻
- Validando um produto complexo.
- Tratando erros de tipo (String no lugar de Number).
Desafio: Limpeza ⚡
Se você recebe um texto de um post com muitos espaços em branco no final, você deve Validar ou Sanitizar?
Resumo ✅
- Backend robusto exige validação rigorosa.
- Limpe os dados antes de salvar (Sanitize).
- Middleware Global centraliza a gestão de falhas.
- Código limpo economiza meses de manutenção.
Próxima Aula: Módulo 3! 🔐
Segurança e Autenticação
- Quem é você? (Authentication).
- O que você pode fazer? (Authorization).
Dúvidas? ✅
Aula 09 - Segurança e Autenticação com JWT 🔐
Portas trancadas e Crachás Digitais
Agenda 📅
- Autenticação vs Autorização
- O Fim das Sessões (Stateful)
- O que é JWT?
- Estrutura: Header, Payload, Signature
- Fluxo de Login completo
- Melhores Práticas de Segurança
1. Quem é Você? (Autenticação) 🚦
- Validar a identidade do usuário.
- Login e Senha.
- Autorização: O que você PODE fazer? (Níveis de acesso).
2. Por que JWT? 🤔
- Abordagem Stateless (Sem estado).
- O servidor não guarda sessão na memória (escalável!).
- Perfeito para Microserviços e Mobile.
3. Estrutura do Token 🎫
- Header: Algoritmo (ex: HS256).
- Payload: Os dados (id, role, nome).
- Signature: O lacre de segurança.
4. O Coração do JWT: A Assinatura 🖋️
- Usa uma
SECRET_KEYno servidor. - Garante que o token não foi "hackeado" ou alterado.
5. Fluxo de Login 🌊
- Envia credenciais -> 2. Servidor valida -> 3. Gera JWT -> 4. Frontend guarda o Token -> 5. Envia no Header em cada requisição.
6. Segurança em Mobile 📱
- Nunca guarde em arquivos de texto!
- Use EncryptedSharedPreferences (Android) ou Keychain (iOS).
7. Melhores Práticas 🏆
- Use chaves secretas longas e seguras.
- Defina tempo de expiração (
expiresIn). - Protocolo HTTPS é obrigatório!
Desafio de Segurança ⚡
O Payload do JWT é criptografado ou apenas codificado? Posso guardar a senha do usuário lá?
Resumo ✅
- JWT permite autenticação rápida e escalável.
- Header + Payload + Signature.
- Stateless = Servidor mais leve.
Próxima Aula: Controle de Acesso 🛡️
Quem manda aqui? (RBAC)
- Middlewares de autorização.
- Protegendo rotas por nível de usuário.
Dúvidas? 🔐
Aula 10 - Controle de Acesso (RBAC) 🛡️
Hierarquia e Segurança em Camadas
Agenda 📅
- O que é RBAC? (Roles)
- Autenticação vs Autorização
- O Fluxo do Middleware
- Erros 401 vs 403
- Protegendo rotas na prática
- Hierarquia de Perfis
1. Role-Based Access Control 👑
- Permissões ligadas a Perfis (Roles).
- Ex: ADMIN, EDITOR, VIEWER.
- Facilita a gestão de milhares de usuários.
2. A Cancela (Middleware) 🚧
- O middleware checa se o usuário tem a "chave" certa.
- Se não tiver -> 403 Forbidden.
- Se tiver ->
next().
3. O Fluxo de Segurança 🌊
graph LR
Req[Request] --> Auth[Autenticação]
Auth --> |OK| Role[Autorização]
Role --> |OK| Controller[Recurso Final]
4. 401 vs 403: Não confunda! ❌
- 401 (Unauthorized): "Quem é você?". Token inválido ou ausente.
- 403 (Forbidden): "Eu sei quem você é, mas não deixo entrar". Falta de permissão.
5. Implementação Dinâmica 🔒
// Middleware genérico
router.delete('/usuario/:id',
autenticar,
autorizar(['ADMIN']),
userController.remover
);
6. Hierarquia de Acesso 🏛️
- Um Admin deve poder acessar rotas de User?
- Design de sistema: Roles "Pai" e "Filho".
7. Melhores Práticas 🏆
- Centralize a lógica em Middlewares.
- Nunca exponha permissões sensíveis no frontend (segurança do lado do servidor).
Desafio: Segurança ⚡
Em um sistema escolar, o Diretor e o Professor podem ver notas. O Aluno só vê as dele. Como você configuraria a Role da rota GET /notas?
Resumo ✅
- RBAC organiza permissões por grupos.
- Middlewares são os guardiões das rotas.
- Diferenciar 401 de 403 é vital para Debug.
Próxima Aula: Segurança Avançada 🏗️
Session vs Token e Refresh Tokens
- O que fazer quando o token expira?
- Protegendo contra ataques comuns (XSS, CSRF).
Dúvidas? 🛡️
Aula 11 - Refresh Token e Segurança Avançada 🏗️
Blindando sua API contra o mundo
Agenda 📅
- O Problema do Token Curto ⏰
- Refresh Tokens (O que são?)
- CORS: Origens e Destinos
- Helmet: Headers de Aço
- Rate Limit: Contra Brute Force
- Ataques Comuns (XSS, Injection)
1. Por que Tokens Expiram? ⏰
- Segurança! Se roubarem o token, ele dura pouco.
- Problema: O usuário odeia fazer login toda hora.
2. Refresh Token 🔁
- Um token de longa duração (7 dias+).
- Serve apenas para trocar por um novo Access Token.
- Deve ser invalidado se o usuário deslogar.
3. CORS: Cross-Origin Resource Sharing 🌍
- "Quem pode me chamar?".
- Resolvido via Headers no Servidor.
- Nunca use
origin: '*'em ambientes reais!
4. Helmet: Proteção de Headers 🪖
- Remove o
X-Powered-By(não diz que é Express). - Adiciona proteção contra Clickjacking e XSS.
5. Rate Limiting 🔨
- 5 tentativas de login por minuto? Sim.
- Evita que robôs tentem descobrir senhas via "força bruta".
6. Onde salvar os Tokens? 🛡️
- Frontend: LocalStorage? Seguro?
- Melhor Prática: Cookies
HttpOnly+Secure.
7. Melhores Práticas de Segurança 🏆
- Use HTTPS sempre.
- Valide TODAS as entradas do usuário.
- Mantenha as bibliotecas atualizadas.
Desafio de Segurança ⚡
Qual a diferença entre 401 e 403 no contexto de Refresh Tokens? Se eu recebo 401, eu tento o refresh ou deslogo o usuário?
Resumo ✅
- Refresh Token equilibra UX e Segurança.
- CORS e Helmet são as portas do seu castelo.
- Proteja-se contra robôs com Rate Limit.
Próximo Módulo: Front-End Moderno 🎨
Saindo das APIs e indo para a Web!
- Introdução ao React/Vite.
- Consumindo nossas APIs no navegador.
Dúvidas? 🏗️
Aula 12 - Introdução ao React ⚛️
O Poder dos Componentes Modernos
Agenda 📅
- O que são SPAs?
- Por que React?
- Vite: A Ferramenta Rápida
- JSX: JS + HTML
- Componentes e LEGO
- Props: O Coração Dinâmico
1. Single Page Applications (SPA) 📄
- O site que nunca recarrega.
- Navegação fluida e instantânea.
- Ex: Gmail, Facebook, Spotify Web.
2. Por que o React venceu? ⚔️
- Componentização (Foco no Reuso).
- Virtual DOM (Foco na Performance).
- Gigantesco Ecossistema (Foco no Emprego).
3. Vite: O Novo Padrão ⚡
- Inicia o projeto em segundos.
- Feedback instantâneo durante o código.
4. JSX: A Mistura Perfeita 🧪
- Parece HTML, mas tem o poder do Javascript.
5. Componentes = LEGO 🧩
- Pequenas partes isoladas.
- Facilita testes e trabalho em equipe.
6. Props: Passando o Bastão 🎁
- Permite que componentes recebam dados do "pai".
- Torna componentes genéricos e reutilizáveis.
Resumo ✅
- SPA torna a Web parecida com Apps.
- React organiza sua UI em componentes.
- Vite é seu melhor amigo no desenvolvimento.
Próxima Aula: Dinâmica e Estado 🎣
O que acontece quando o usuário clica?
- Hooks:
useState. - Reatividade na prática.
Dúvidas? ⚛️
Aula 13 - Estado e Hooks 🎣
Tornando seu App Interativo
Agenda 📅
- O que é o Estado (State)?
- Hook
useState - Lidando com Cliques e Eventos
- Inputs Controlados
- Imutabilidade e Arrays
1. O Problema da Estática 🧱
- Variáveis comuns mudam nos bastidores...
- ...mas a tela continua a mesma!
- O React precisa de um sinal para re-desenhar.
2. useState: O Motor de Mudança 🚀
- cont: O valor atual.
- setCont: A função que atualiza.
- 0: O ponto de partida.
3. Eventos no React ⚡
onClick={funcao}onChange={(e) => ...}- Sempre em CamelCase!
4. Inputs Controlados ⌨️
- O React é quem manda no valor do input.
value={estado}+onChange.- Facilita validação e limpeza de campos.
5. Imutabilidade (Muito Importante!) 💎
- Nunca altere o estado original:
lista.push(x)❌ - Sempre crie uma cópia nova:
setLista([...lista, x])✅
6. Fluxo de Dados 🌊
- O estado flui do Pai para o Filho via Props.
- Se o estado do Pai muda, todo mundo abaixo dele atualiza.
Desafio de Estado ⚡
Se eu tenho um botão que soma +1 ao contador, o que acontece com a interface se eu esquecer de importar o useState e usar uma variável global let contador = 0?
Resumo ✅
useStatetraz vida aos componentes.- Mudança de estado = Re-renderização.
- Use sempre funções disparadoras (
set...).
Próxima Aula: Efeitos e APIs 🌐
Buscando dados no mundo real!
- Hook:
useEffect. - Consumindo nossa API Backend.
Dúvidas? 🎣
Aula 14 - Efeitos e APIs 🌐
Conectando seu App ao Mundo Real
Agenda 📅
- O que são Side Effects?
- Hook
useEffect - O Array de Dependências
- Buscando dados com
fetch - Estados de Carregamento e Erro
1. Além da Interface 🧪
- Efeitos colaterais são ações que tocam o mundo externo ao componente.
- Ex: Buscar usuários, mudar o título da aba, iniciar um cronômetro.
2. useState vs useEffect 🥊
- useState: Para dados que o usuário vê mudando.
- useEffect: Para ações que o componente faz "sozinho".
3. Os 3 Momentos do useEffect 🕒
- Montagem: Quando o componente nasce.
- Atualização: Quando um dado monitorado muda.
- Desmontagem: Quando o componente morre (Cleanup).
4. O Array de Dependências [] 🗃️
[]-> Roda só uma vez.[cont]-> Roda sempre quecontmudar.Sem array-> Roda em toda atualização (Perigo!).
5. Chamadas de API (Fetch) 📨
useEffect(() => {
fetch("https://api...")
.then(res => res.json())
.then(data => setData(data));
}, []);
6. UX: Estados de Rede 🛡️
- Loading: Mostre um Spinner enquanto espera.
- Error: Avise se a internet caiu ou o usuário não existe.
- Empty: Diga se não há resultados.
Desafio de Efeito ⚡
Se você colocar um alert("Olá") dentro de um useEffect sem o array [], quantas vezes o alerta vai aparecer se o usuário ficar digitando em um campo de texto que atualiza o estado?
Resumo ✅
useEffectorganiza as ações assíncronas.- Controle quando rodar via array de dependências.
- Trate sempre o carregamento e erros para uma boa UX.
Próxima Aula: Navegação 🚦
Multi-páginas com React Router!
/home,/perfil,/contato.- Links e Navegação Programática.
Dúvidas? 🌐
Aula 15 - React Router 🚦
Criando Apps Multi-Página
Agenda 📅
- O que são SPAs?
- Multi-páginas (Simuladas)
- Componentes de Rota
- Navegação (
LinkeuseNavigate) - Parâmetros dinâmicos (
:id)
1. O Mundo do SPA ⚛️
- O site é uma única página HTML.
- O Javascript "troca" a tela sem recarregar.
- UX rápida e fluida.
2. React Router Dom ⚙️
- A biblioteca padrão para web.
- Permite que a URL combine com o que aparece na tela.
3. A Estrutura Básica 🏗️
- BrowserRouter: O container principal.
- Routes: O seletor de rotas.
- Route: Define o caminho (
path) e o componente (element).
4. Navegando sem Recarregar! 🏃♂️
- Use
<Link to="/contato"> - NUNCA use
<a href="...">para rotas internas.
5. Navegação Programática 🚀
- Ideal para redirecionar após ações (Login, Clique em Card).
6. Rotas Dinâmicas (URL Params) 🆔
path="/perfil/:username"- Hook
useParams()captura o valor. - Uma única página que se adapta a mil perfis.
7. Página 404 (Not Found) 👻
path="*"- Garante que o usuário nunca caia em uma tela em branco.
Desafio de Roteamento ⚡
Se eu digitar www.meusite.com/asdfg e não tiver uma rota configurada para isso, o que o usuário vai ver se eu NÃO colocar uma rota com o path="*"?
Resumo ✅
- Roteamento traz a sensação de um site real.
- Hooks
useNavigateeuseParamssão essenciais. - SPAs são o padrão da indústria moderna.
Próxima Aula: O Grande Final 🏆
Projeto Integrado: Backend + Frontend!
- Conectando nossa API Node ao site React.
- O Projeto Final do Curso!
Dúvidas? 🚦
Aula 16 - Projeto Final e Conclusão �
De aluno a Desenvolvedor Full-Stack
Agenda 📅
- O Desafio Final 🔗
- Requisitos Técnicos
- Portfólio no GitHub
- Onde continuar estudando?
- Mensagem de Encerramento
1. O Desafio Final 🚀
Você deve entregar um projeto integrado contendo: - Frontend: SPA em React com rotas. - Backend: API segura em Node.js. - Integração: Conexão real entre os dois. - Design: CSS moderno e responsivo.
2. Sugestões de Temas 💡
- Gerenciador de Tarefas �
- Mini E-commerce 🛒
- Rede Social Simplificada 💬
- Dashboard de Monitoramento 📊
3. O README de Elite ✨
- Prints ou Vídeos do site funcionando.
- Lista detalhada de tecnologias.
- Guia: "Como rodar o Projeto".
4. Onde ir agora? 📚
- TypeScript: Segurança de tipos.
- Bancos SQL: Postgres e MySQL.
- Next.js: O rei do mercado React.
- Docker: Infraestrutura moderna.
5. Soft Skills 🤝
- Não é só saber programar!
- Trabalho em equipe.
- Resolução de problemas reais.
6. O Mercado Full-Stack 📈
- Demanda altíssima por devs completos.
- Salários excelentes.
- Dashboards e Sistemas Web movem o mundo!
7. Mensagem Final 🌟
"Programar é a arte de criar soluções onde antes só havia problemas."
- Você construiu a base sólida.
- O código é sua ferramenta de transformação.
Parabéns pela Jornada! 🎓🚀
Vá e construa o futuro da Web.
Dúvidas Finais? 🤔
Configuração
Ambientes de Desenvolvimento 🛠️
Guias para configurar seu computador para o desenvolvimento frontend moderno.
-
Foundation --- Instalação do Node.js (LTS), NPM e editores de código.
-
Vue Tooling --- Configuração do Vue DevTools e extensões essenciais.
-
Build & Tools --- Vite v6, Git e ferramentas de terminal.
Setup 01 - Node.js e NPM 🟢
O Node.js é o motor que nos permite rodar ferramentas de desenvolvimento (como o Vite) e gerenciar bibliotecas em nossa máquina.
📥 Instalação
- Acesse o site oficial: nodejs.org.
- Baixe a versão LTS (Long Term Support). Ela é a mais estável e recomendada para produção.
- Siga o instalador padrão ("Next, Next, Finish").
🧪 Verificação
Abra seu terminal (CMD, PowerShell ou Terminal do Mac) e digite:
Se aparecerem as versões, a instalação foi um sucesso!💡 Dica: NVM (Opcional)
Se você precisar gerenciar várias versões do Node no futuro, pesquise pelo NVM (Node Version Manager). Ele facilita a troca de versões sem precisar desinstalar nada.
Setup 02 - VS Code e Extensões Essenciais 💻
O Visual Studio Code é o editor de código mais popular do mundo, e com as extensões certas, ele se torna uma IDE super poderosa para Vue.
📥 Instalação do VS Code
Baixe em: code.visualstudio.com
🧩 Extensões Obrigatórias para Vue 3
Abra o menu de extensões (Ctrl + Shift + X) e instale:
- Vue - Official (antiga Volar): Suporte oficial para arquivos
.vue, incluindo realce de sintaxe e autocompletar. - ESLint: Ajuda a identificar erros de código enquanto você digita.
- Prettier - Code formatter: Formata seu código automaticamente ao salvar, deixando-o limpo.
- Auto Close Tag: Fecha as tags HTML/Vue automaticamente.
🛠️ Configuração Recomendada
Vá em Configurações -> Editor: Format On Save e deixe marcado como ativado. Isso garantirá que o Prettier formate seu código toda vez que você salvar o arquivo.
Setup 03 - Browser e Vue DevTools 🕵️
Para desenvolver frontend, o navegador não é apenas onde vemos o site, mas também nossa principal ferramenta de depuração.
🌐 Navegador Recomendado
- Google Chrome ou Microsoft Edge possuem as ferramentas de desenvolvedor mais robustas para o ecossistema Vue.
🛠️ Instalando Vue DevTools
O Vue DevTools permite "enxergar" as variáveis reativas, o estado do Pinia e a árvore de componentes.
- Acesse a loja de extensões (Chrome Web Store).
- Procure por Vue.js devtools e clique em "Usar no Chrome".
- Após instalar, reinicie o navegador.
🚀 Como Usar
No seu projeto Vue rodando:
1. Clique com o botão direito na página e selecione Inspecionar.
2. Procure a aba Vue no menu superior do console.
3. Agora você pode ver todas as suas refs e reactive em tempo real!
Setup 04 - Vite e Scaffolding ⚡
O Vite é a ferramenta que prepara todo o nosso ambiente de desenvolvimento, compila o código e permite que vejamos as mudanças no navegador instantaneamente.
🚀 Criando o Projeto
Abra o terminal na pasta onde deseja salvar seus estudos e digite:
Siga os passos:
1. Project name: dê um nome (ex: meu-app-vue)
2. Select a framework: escolha Vue
3. Select a variant: escolha JavaScript (ou TypeScript, se preferir o desafio)
📦 Iniciando os trabalhos
Entre na pasta criada e instale as dependências:
Agora, acesse a URL que aparecerá no terminal (geralmente http://localhost:5173) e veja sua aplicação Vue rodando com performance de ponta!
Setup 05 - Git e GitHub Essentials 🐙
O controle de versão é obrigatório em qualquer projeto profissional. Através dele, você salva o histórico do seu código e compartilha com o mundo.
📥 Instalando o Git
- Baixe em: git-scm.com
- Durante a instalação, pode manter as opções padrão.
🔑 Configuração Inicial
Execute os comandos abaixo substituindo pelo seu nome e e-mail:
🚀 Fluxo de Trabalho Básico
git init: Inicia o repositório.git add .: Prepara todos os arquivos para salvar.git commit -m "Mensagem": Salva o estado atual.git push: Envia para o servidor (GitHub).
Dica: Não esqueça de criar o arquivo .gitignore para não enviar a pasta node_modules para o GitHub! O Vite já cria um para você por padrão.
Setup 06 - Terminal Essentials ⌨️
O terminal (ou CLI) é a nossa principal interface com as ferramentas de build e automação no mundo frontend.
🏁 Terminais Recomendados
- Windows: Windows Terminal (PowerShell 7) ou Git Bash.
- Mac/Linux: iTerm2 ou o Terminal nativo com Zsh (Oh My Zsh).
🚀 Comandos de Sobrevivência
Aprenda estes comandos básicos para navegar livremente:
- cd [pasta]: Entra em uma pasta.
- cd ..: Volta uma pasta.
- ls ou dir: Lista os arquivos da pasta atual.
- mkdir [nome]: Cria uma nova pasta.
- clear ou cls: Limpa a tela do terminal.
💡 Atalho do VS Code
Você não precisa sair do editor para usar o terminal!
Use o atalho Ctrl + ` (crase) para abrir o terminal integrado diretamente no seu código.
Setup 07 - Tailwind CSS IntelliSense 🎨
Se você optar por usar o Tailwind CSS para estilizar seus aplicativos Vue, esta extensão no VS Code é indispensável.
🧩 Por que usar?
- Autocompletar: Ela sugere todas as classes do Tailwind enquanto você digita no HTML.
- Preview de cor: Mostra um quadradinho com a cor real ao lado do nome da classe (ex:
bg-blue-500). - Dicas de sintaxe: Avisa se você estiver usando classes que conflitam entre si.
📥 Instalação
Procure por Tailwind CSS IntelliSense na loja de extensões do seu VS Code.
🛠️ Requisito do Projeto
Para que a extensão funcione, seu projeto precisa ter um arquivo de configuração do Tailwind (gerado via npx tailwindcss init -p). Sem esse arquivo na raiz, a extensão não saberá quais classes sugerir.
Setup 08 - Testando APIs (Postman/Insomnia) 📡
Antes de escrever o código Vue para consumir uma API, é uma boa prática testar se essa API está funcionando e o que ela retorna.
🛠️ Ferramentas
- Postman: A mais completa e tradicional.
- Insomnia: Mais leve, limpa e focada em UX.
- Thunder Client: Uma extensão direta dentro do VS Code (fácil e rápida).
🚀 Como Testar
- Coloque a URL da API (ex:
https://jsonplaceholder.typicode.com/users). - Selecione o método (GET, POST, etc).
- Clique em Send.
- Veja o formato do JSON que o servidor responde. Isso ajuda muito na hora de tipar seus dados no Vue!
💡 Dica
Sempre teste suas rotas de POST (Criação) e DELETE nestas ferramentas antes de tentar debugar no código frontend.
Setup 09 - Deploy: Colocando no Ar 🚢
Não guarde seu código apenas no seu computador! Coloque seu projeto no ar para que o mundo (e recrutadores) possa ver.
🌐 Plataformas Recomendadas
As plataformas Vercel e Netlify são especialistas em hospedar aplicações Vue com processo de deploy automático.
🚀 Passo a Passo (Vercel/Netlify)
- Crie uma conta gratuita usando seu GitHub.
- Clique em Add New Project.
- Selecione o repositório do seu projeto Vue.
- Clique em Deploy.
🔄 Deploy Contínuo (CI/CD)
O melhor dessas ferramentas é que, de agora em diante, toda vez que você fizer um git push para o GitHub, o seu site será atualizado automaticamente no ar em poucos segundos!
🧪 Domínio Personalizado
Ambas oferecem um link gratuito no formato meu-app.vercel.app. Caso queira, futuramente você pode comprar um domínio .com.br e vincular nestas mesmas ferramentas.
Sobre
Sobre o Curso
🎓 Desenvolvimento Frontend com Vue.js 3
Este curso foi projetado para capacitar desenvolvedores na criação de aplicações web modernas do tipo SPA (Single Page Application), focando na reatividade, componentização e escalabilidade oferecidas pelo ecossistema Vue.js.
🎯 Objetivos do Curso
-
Framework Progressivo --- Compreender a filosofia do Vue.js e como ele se integra a sistemas existentes ou serve de base para SPAs robustas.
-
Componentização Extrema --- Dominar a criação de interfaces modulares, reutilizáveis e fáceis de manter utilizando Single File Components (SFC).
-
Reatividade & Estado --- Implementar sistemas reativos eficientes com Composition API e gerenciamento de estado global com Pinia.
-
Integração & Deploy --- Consumir APIs RESTful com Axios, gerenciar rotas complexas com Vue Router e realizar builds otimizados para produção.
📚 Módulos de Aprendizado
Módulo 1 – Fundamentos do Frontend Moderno
- Evolução do Frontend e Conceito de SPA
- Setup de Ambiente com Vite e Node.js
- Sintaxe Declarativa e Data Binding (v-bind, v-model)
- Diretivas e Renderização Condicional
Módulo 2 – Componentização e Arquitetura
- Criação e Registro de Componentes
- Comunicação via Props e Emitters (emit)
- Ciclo de Vida do Componente (Lifecycle Hooks)
- Organização de Projetos e Boas Práticas
Módulo 3 – Roteamento e Estado Global
- Configuração do Vue Router e Rotas Dinâmicas
- Consumo de APIs REST com Axios
- Gerenciamento de Estado Global com Pinia
- Integração de Dados em Tempo Real
Módulo 4 – Profissionalização e Ecossistema
- Estilização com Scoped CSS e introdução ao Tailwind
- Arquitetura de Camadas (Services, Stores, Views)
- Otimização de Build e Variáveis de Ambiente
- Deploy Contínuo em Vercel ou Netlify
🛠️ Metodologia
Foco 100% prático e orientado a projetos (Learning by Doing). Ao longo das 16 aulas, você desenvolverá desde pequenos componentes até um sistema de tarefas estilo Kanban integrado a uma API, consolidando seu portfólio como desenvolvedor frontend.
Pronto para criar interfaces incríveis? Começar Agora
Roadmap do Projeto: Vue.js 3 🚀
Este documento rastreia a evolução do curso e o status de implementação de cada fase.
🕒 Fase 1: Planejamento & Setup
- [x] Definição Syllabus (16 Aulas de Vue.js)
- [x] Configuração
mkdocs.ymle Metadados - [x] Reformulação de Páginas Globais (Sobre, Plano, Materiais, Roadmap)
✅ Fase 2: Conteúdo Pedagógico
- [x] Implementação das 16 Aulas (Padrão Mermaid/Termynal)
- [x] Criação dos 16 Conjuntos de Exercícios (5 itens/aula)
- [x] Criação dos 16 Quizzes Interativos (10 questões/aula)
- [x] Desenvolvimento dos 16 Mini-projetos
✅ Fase 3: Recursos Visuais & Slides
- [x] Geração de 16 Slides Reveal.js (Padrão Vue.js)
- [x] Padronização de Admonitions e Content Tabs
- [x] Validação Visual e UX no Material Theme
✅ Fase 4: Entrega & Deploy
- [x] Build Final
mkdocs build - [ ] Configuração de Deployment automático (GitHub Actions)
- [x] Verificação final de links e integridade
Status Atual: Concluído (Refatoração) Última Atualização: 22/02/2026
Materiais Complementares 📚
Bem-vindo à seção de materiais complementares do curso de Desenvolvimento Frontend com Vue.js. Aqui você encontra recursos adicionais para apoiar seus estudos e aprofundar seu conhecimento técnico.
-
- Acompanhe o conteúdo teórico com slides dinâmicos em Reveal.js.
-
- Pratique a reatividade, componentização e consumo de APIs.
-
- Valide seu aprendizado com 10 questões rápidas por aula.
-
- Construa um ecossistema frontend completo para seu portfólio.
-
- Guias de instalação (Node.js, Vite, Vue DevTools).
Versão para Impressão
Esta página foi gerada automaticamente para impressão.