Table of Contents
Desenvolvimento de APIs e Microsserviços 💻
Domine a criação de arquiteturas modernas de backend com Microsserviços, modelagem RESTful, segurança com JWT e o desenvolvimento de interfaces SPA modernas.
Foco do Curso
Metodologia: Aprendizado prático focado na construção de ecossistemas Fullstack, integrando serviços backend robustos com frontends de alta performance.
🎯 O Que Você Vai Aprender
-
Microsserviços --- Aprenda a decompor monólitos, gerenciar comunicação entre serviços e utilizar API Gateways para escalabilidade. Ir para Módulo 1
-
Modelagem RESTful --- Domine endpoints, status codes, documentação com Swagger/OpenAPI e padrões de projeto para APIs profissionais. Ver Modelagem
-
Autenticação JWT --- Implemente segurança de ponta a ponta com JSON Web Tokens, proteção de rotas e controle de acesso RBAC. Ver Segurança
-
Frontends SPA --- Integre seu backend com Single Page Applications modernas, explorando componentes, estados e roteamento dinâmico. Ver Projetos
📚 Jornada de Aprendizado (16 Aulas)
O curso é estruturado em quatro trilhas de especialização.
🧱 Módulo 1: Serviços e Microsserviços (Aulas 01-04)
- Aula 01 - Intro Microsserviços 🧩
- Aula 02 - Arquitetura e Gateway 🏗️
- Aula 03 - Modelagem REST 📡
- Aula 04 - Documentação (Swagger) 📄
🏗️ Módulo 2: CRUD e Persistência (Aulas 05-08)
- Aula 05 - Implementação de APIs ⚙️
- Aula 06 - Persistência e Banco 💾
- Aula 07 - Testes Unitários 🧪
- Aula 08 - Testes Integrados 🚢
🔌 Módulo 3: Autenticação e Segurança (Aulas 09-11)
🚀 Módulo 4: Aplicações Web SPA (Aulas 12-16)
- Aula 12 - Conceito de SPA 🌐
- Aula 13 - Componentes e Templates 🧱
- Aula 14 - Estados e Eventos 🔄
- Aula 15 - Roteamento 🛣️
- Aula 16 - Integração e Projeto Final 🎓
Plano de Ensino 📅
Curso: Desenvolvimento Frontend com Svelte
Ementa
Capacitar o aluno a desenvolver aplicações web modernas utilizando o framework Svelte, aplicando conceitos de reatividade, componentização, consumo de APIs REST, roteamento, gerenciamento de estado e boas práticas de desenvolvimento frontend.
Cronograma (16 Aulas)
Módulo 1: Fundamentos e Reatividade
- Aula 01: Introdução ao Desenvolvimento Frontend Moderno
- Aula 02: Introdução ao Svelte e Compilação
- Aula 03: Estrutura de Projeto e Sintaxe Básica
- Aula 04: Reatividade no Svelte ($:)
Módulo 2: Componentização e UI
- Aula 05: Componentização e Props
- Aula 06: Loops e Condicionais (
{#if},{#each}) - Aula 07: Manipulação de Eventos e Formulários
- Aula 08: Estilização e Escopo de CSS
Módulo 3: Ecossistema e Estado
- Aula 09: Roteamento SPA na Prática
- Aula 10: Stores e Gerenciamento de Estado
- Aula 11: Consumo de API REST (Fetch/Async)
- Aula 12: CRUD Completo com API
Módulo 4: Avançado e Produção
- Aula 13: Ciclo de Vida e Performance
- Aula 14: Boas Práticas e Arquitetura Frontend
- Aula 15: Build, Deploy e Variáveis de Ambiente
- Aula 16: Projeto Final (Dashboard/Admin)
Avaliação
- Exercícios: 16 listas (5 questões cada: 2 Básicas, 2 Intermediárias, 1 Desafio).
- Projetos: 16 mini-projetos práticos de fixação.
- Quizzes: 16 testes de 10 perguntas com feedback.
- Projeto Final: Desenvolvimento de uma aplicação completa avaliada no final do curso.
Aulas
Aulas do Curso 📚
Acesse aqui todo o conteúdo teórico dividido em módulos de aprendizado.
-
Módulo 1: Fundamentos e Reatividade --- A base do Svelte e o conceito de reatividade nativa.
-
Módulo 2: Componentização e UI --- Construindo interfaces modulares e dinâmicas.
-
Módulo 3: Ecossistema e Estado --- Roteamento, gerenciamento de estado e APIs.
-
Módulo 4: Avançado e Produção --- Performance, ciclos de vida e deploy final.
Aula 01 - Introdução ao Desenvolvimento Frontend Moderno 🌐
Objetivo
Objetivo: Compreender a evolução das tecnologias de frontend, entender o conceito de Single Page Applications (SPA) e como a reatividade mudou a forma de construir interfaces web modernas.
1. A Evolução do Frontend 🚀
O desenvolvimento web percorreu um longo caminho desde as páginas HTML estáticas dos anos 90 até as aplicações altamente interativas de hoje.
🏛️ Web 1.0: Páginas Estáticas (MPA)
Antigamente, cada clique em um link solicitava uma página inteira do servidor. * MPA (Multi-Page Application): Todo o processamento era feito no backend. * Experiência: Lenta, com "piscadas" brancas a cada navegação.
⚡ Web 2.0 e o Surgimento do AJAX
Com o AJAX, passamos a atualizar partes da página sem recarregá-la completamente. Isso abriu portas para redes sociais e apps como o Gmail.
📱 Era das SPAs (Single Page Applications)
Aplicações modernas carregam uma única página e usam JavaScript para trocar o conteúdo dinamicamente. * Vantagem: Fluidez de aplicativo nativo no navegador.
2. SPA vs MPA: Qual a diferença? ⚖️
| Característica | 🏛️ MPA (Tradicional) | ⚡ SPA (Moderno) |
|---|---|---|
| Carregamento | Páginas inteiras a cada clique | Carrega uma vez, troca componentes |
| Processamento | Focado no Servidor | Focado no Navegador (Cliente) |
| Experiência | Mais lenta, recarregamentos | Fluida, transições suaves |
| SEO | Nativo e fácil | Exige configurações (SSR/SSG) |
Fluxo de Comunicação (Mermaid)
graph LR
subgraph "Modelo MPA"
C1[Browser] -- "Solicita Pagina_A.html" --> S1[Servidor]
S1 -- "Envia HTML Completo" --> C1
end
subgraph "Modelo SPA"
C2[Browser] -- "Solicita dados (JSON)" --> S2[API]
S2 -- "Envia apenas Dados" --> C2
C2 -- "JavaScript renderiza UI" --> C2
end
3. O Conceito de Reatividade 🧠
A reatividade é o "superpoder" dos frameworks modernos. Ela garante que, quando os dados mudam, a interface (UI) atualize automaticamente.
Conceito Chave
Em sistemas tradicionais, você precisava buscar o elemento no DOM e alterar seu texto manualmente. Em frameworks reativos como o Svelte, você apenas altera o valor da variável e o framework cuida do resto.
4. Frameworks Modernos: Onde o Svelte se encaixa? 🧩
Existem três grandes players no mercado (React, Vue, Angular), mas o Svelte trouxe uma abordagem revolucionária:
- React/Vue: Usam o Virtual DOM (uma cópia da página na memória) para comparar mudanças no navegador.
- Svelte: É um compilador. Ele transforma seu código em JavaScript puro e eficiente durante o build, eliminando a necessidade de uma "biblioteca" pesada rodando junto com o seu site.
5. Verificando o Ambiente 💻
Antes de começarmos, precisamos garantir que seu computador está pronto para o Svelte.
<div id="termynal" data-termynal>
<span data-ty="input">node --version</span>
<span data-ty="progress"></span>
<span data-ty>v20.10.0</span>
<span data-ty="input">npm --version</span>
<span data-ty>10.2.3</span>
</div>
Atenção
Certifique-se de ter o Node.js instalado (versão 18 ou superior). Se não tiver, acesse o guia de Configuração de Ambiente.
6. Mini-Projeto: Seu Primeiro "App" Estático 🚀
Para sentir a diferença, vamos apenas visualizar a estrutura básica que o Vite (nossa ferramenta de build) cria para o Svelte.
- Abra seu terminal.
- Tente rodar o comando abaixo (não precisa criar agora, apenas observe):
Dica
O Svelte é conhecido por ter "menos código". Você verá que um componente Svelte parece muito com uma página HTML normal, o que facilita muito o aprendizado.
7. Exercício de Fixação 📝
Responda para validar seu conhecimento:
- O que define uma Single Page Application (SPA)?
- Explique com suas palavras o que é reatividade no frontend.
- Qual o principal diferencial do Svelte em relação ao React e Vue (Dica: compile-time vs run-time)?
Próxima Aula: Vamos mergulhar no Svelte e entender como a compilação funciona! 🏗️
Aula 02 - Introdução ao Svelte 🏗️
Objetivo
Objetivo: Compreender o que torna o Svelte único, entender o processo de compilação e criar o seu primeiro projeto utilizando o Vite.
1. O que é o Svelte? 🧩
O Svelte é um framework para a criação de interfaces de usuário, mas com uma diferença fundamental: ele não carrega o peso de uma biblioteca no navegador.
Tradicionalmente, frameworks como React e Vue fazem a maior parte de seu trabalho no navegador do usuário (tempo de execução). O Svelte move esse trabalho para uma fase de compilação que acontece quando você constrói seu aplicativo.
🌟 Principais Vantagens:
- Performance Absurda: O código resultante é JavaScript puro e altamente otimizado.
- Menos Código: Você escreve muito menos para fazer a mesma coisa.
- Sem Virtual DOM: Menos overhead de memória no navegador.
2. Como funciona a Compilação? ⚙️
Enquanto outros frameworks comparam o DOM "virtual" com o real para saber o que mudar, o Svelte gera código que sabe exatamente qual parte do DOM atualizar quando uma variável muda.
Fluxo de Trabalho (Mermaid)
graph TD
subgraph "Frameworks Tradicionais (React/Vue)"
A[Código JS] --> B[Biblioteca em Runtime]
B --> C[Virtual DOM]
C --> D[Patch no DOM Real]
end
subgraph "Svelte (O Compilador)"
E[Código .svelte] --> F{Svelte Compiler}
F -- "Build Time" --> G[JS Puro e Direto]
G -- "Runtime" --> H[Update DOM Real]
end
3. Virtual DOM vs Svelte 🥊
O Virtual DOM foi uma inovação incrível, mas ele consome recursos. O Svelte provou que podemos ser reativos sem precisar dele.
| Característica | Frameworks com VDOM | Svelte |
|---|---|---|
| Peso do Bundle | Maior (Apps precisam da biblioteca) | Mínimo (Apenas seu código) |
| Mudanças | Compara árvores de objetos | Atualiza o nó específico via código gerado |
| Aprendizado | Exige entender JSX ou Hooks complexos | Quase HTML/JS puro |
4. Criando seu Primeiro Projeto 🚀
Vamos usar o Vite, que é o "motor" mais moderno e rápido para desenvolvimento frontend.
<div id="termynal" data-termynal>
<span data-ty="input">npm create vite@latest meu-primeiro-app -- --template svelte</span>
<span data-ty="progress"></span>
<span data-ty>✔ Done. Now run:</span>
<span data-ty="input">cd meu-primeiro-app</span>
<span data-ty="input">npm install</span>
<span data-ty="input">npm run dev</span>
</div>
Nota
O comando acima cria uma estrutura base pronta para você começar a codar imediatamente.
5. Estrutura de Arquivos Base 📂
Após criar o projeto, você verá uma estrutura parecida com esta:
src/main.js: Ponto de entrada da aplicação.src/App.svelte: O componente principal (onde a mágica acontece).public/: Arquivos estáticos (imagens, ícones).index.html: O arquivo HTML que carrega seu app.
6. Mini-Projeto: Ola Mundo com Estilo 🎨
Sua missão nesta aula é:
1. Criar seu projeto com o comando visto acima.
2. Abrir o arquivo App.svelte.
3. Alterar o texto dentro da tag <h1> para "Olá, Svelte!".
4. Rodar o projeto e ver a mudança no navegador.
Dica Visual
O VS Code com a extensão oficial do Svelte é obrigatório para ter coloração de código e sugestões inteligentes!
7. Exercício de Fixação 📝
- Por que dizemos que o Svelte é um compilador e não apenas uma biblioteca?
- Descreva uma desvantagem do uso do Virtual DOM.
- O que é o Vite e qual sua função no desenvolvimento com Svelte?
Próxima Aula: Vamos explorar a Sintaxe Básica e a Estrutura de um Componente! 📜
Aula 03 - Estrutura de Projeto e Sintaxe Básica 📜
Objetivo
Objetivo: Entender a anatomia de um componente Svelte, aprender como organizar seu código unindo lógica, estrutura e estilo em um só lugar, e dominar a exibição de dados dinâmicos.
1. Anatomia de um Componente Svelte 🧬
Diferente de outros frameworks onde você mistura HTML e JavaScript de forma complexa, um arquivo .svelte é extremamente organizado e intuitivo. Ele se divide em três partes principais:
1.1 O Script (<script>)
Onde fica toda a lógica JavaScript do seu componente (variáveis, funções, imports).
1.2 O Markup (HTML)
O corpo do seu componente. É HTML puro, com alguns "superpoderes" do Svelte.
1.3 O Style (<style>)
Onde você coloca o CSS. Importante: Por padrão, o CSS no Svelte é escopado, o que significa que ele só afeta o componente atual.
2. Visualizando a Estrutura (Mermaid) 📊
graph TD
A[Arquivo .svelte] --> B["script (Lógica)"]
A --> C["Markup (Estrutura HTML)"]
A --> D["style (Aparência)"]
subgraph "Exemplo Prático"
B1["let nome = 'Mundo';"]
C1["h1 Olá {nome} /h1"]
D1["h1 { color: orange; }"]
end
B --- B1
C --- C1
D --- D1
3. Interpolação de Variáveis {} ✏️
Para exibir um valor do seu JavaScript no HTML, usamos as chaves {}. Isso é chamado de interpolação.
<script>
let framework = "Svelte";
let versao = 5;
</script>
<h1>Aprendendo {framework} na versão {versao}!</h1>
Conceito
Tudo o que estiver dentro das chaves é tratado como JavaScript puro. Você pode até fazer cálculos: {2 + 2} resultará em 4 na tela.
4. O Cinto de Utilidades: Estrutura do Projeto 📂
Ao abrir seu projeto no VS Code, você verá muitos arquivos. Vamos focar no essencial:
$ ls -F
node_modules/
public/
src/
├── assets/
├── lib/
├── App.svelte
└── main.js
index.html
package.json
vite.config.js
src/App.svelte: É o coração da sua aplicação no início.vite.config.js: Configurações da ferramenta que compila seu código.
5. Atributos Dinâmicos 🔗
Você também pode usar as chaves para definir atributos HTML, como o src de uma imagem ou o href de um link.
<script>
let imagemSrc = "logo.png";
let altText = "Logo do Svelte";
</script>
<img src={imagemSrc} alt={altText} />
6. Mini-Projeto: Perfil de Usuário Dinâmico 🚀
Sua missão agora:
1. No seu projeto, limpe o conteúdo de App.svelte.
2. No <script>, crie variáveis para nome, idade e urlFoto.
3. No markup, crie um card simples que exiba essas informações usando as chaves {}.
4. No <style>, adicione uma cor de fundo ao card.
Dica de Ouro
Se o nome da variável for o mesmo do atributo, você pode usar o atalho: <img {src} /> em vez de <img src={src} />.
7. Exercício de Fixação 📝
- Quais são as três seções principais de um arquivo
.svelte? - O que acontece com o CSS definido dentro de um componente Svelte?
- Como exibimos o resultado da soma de duas variáveis no HTML do Svelte?
Próxima Aula: Vamos aprender sobre o coração do Svelte: a Reatividade! ⚡
Aula 04 - Reatividade no Svelte ⚡
Objetivo
Objetivo: Dominar o conceito de reatividade, aprender a usar a sintaxe $: para criar variáveis dependentes e entender como o Svelte atualiza a interface de forma cirúrgica.
1. O que é Reatividade? 🔄
Reatividade é a capacidade de um sistema responder a mudanças de dados. No Svelte, a reatividade é baseada em atribuições.
Quando você faz count = count + 1, o Svelte sabe que a variável count mudou e agenda uma atualização para todos os lugares onde ela é usada no HTML.
2. Declarações Reativas ($:) 🧠
Às vezes, queremos que uma variável seja recalculada automaticamente sempre que outra variável mudar. Para isso, usamos o prefixo $:.
<script>
let count = 0;
// Esta variável SEMPRE será o dobro de count
$: dobrado = count * 2;
</script>
<button on:click={() => count++}>Clique: {count}</button>
<p>O dobro é {dobrado}</p>
Conceito
O símbolo $: pode ser lido como "sempre que as variáveis usadas aqui mudarem, execute isto de novo".
3. Blocos Reativos 🧱
Você não está limitado a apenas variáveis. Você pode usar $: para executar blocos inteiros de código ou condicionais reativas.
<script>
let count = 0;
$: {
console.log("O contador mudou para:", count);
if (count >= 10) {
alert("Você clicou muito!");
count = 0;
}
}
</script>
4. O Fluxo de Reatividade (Mermaid) 📊
graph TD
A[Ação do Usuário/Evento] --> B[Alteração de Variável]
B --> C{Compilador Svelte}
C -- "Detecta dependências ($:)" --> D[Atualiza Variáveis Derivadas]
D --> E[Sincroniza com o DOM Real]
E --> F[Interface Atualizada]
5. Dica Pro: Debugging Reativo 💻
Uma forma muito comum e rápida de debugar no Svelte é usar o $: com o console.log.
<div id="termynal" data-termynal>
<span data-ty="input">$: console.log(minhaVariavel)</span>
<span data-ty="progress"></span>
<span data-ty>O contador mudou para: 1</span>
<span data-ty>O contador mudou para: 2</span>
</div>
6. Mini-Projeto: Calculadora de Área de Retângulo 🚀
Vamos aplicar a reatividade em um exemplo prático:
1. No seu App.svelte, crie duas variáveis: largura e altura (inicie com 10).
2. Crie uma declaração reativa para area que multiplique as duas.
3. No markup, crie dois campos de input vinculados a essas variáveis (usaremos bind:value, que veremos mais a fundo na Aula 07, mas tente usar agora!).
4. Exiba a área na tela. Ela deve mudar instantaneamente enquanto você digita.
Curiosidade
O $: é na verdade uma sintaxe válida do JavaScript chamada "Labeled Statement". O Svelte apenas deu um novo significado a ela para facilitar sua vida!
7. Exercício de Fixação 📝
- O que dispara uma atualização reativa no Svelte?
- Para que serve o prefixo
$:? - Como você criaria um alerta que só aparece quando uma variável
nomeestiver vazia, usando reatividade?
Próxima Aula: Vamos aprender a organizar nosso código com a Componentização! 🧩
Aula 05 - Componentização 🧩
Objetivo
Objetivo: Entender o conceito de componentes, aprender a quebrar sua interface em partes menores e reutilizáveis, e descobrir como passar dados entre elas usando Props.
1. O que são Componentes? 🏗️
Componentes são blocos de construção independentes de uma aplicação. Em vez de criar um arquivo HTML gigante, dividimos o site em partes como Navbar, Sidebar, CardProduto e Footer.
Por que usar componentes?
- Reutilização: Crie um botão uma vez e use em todo o site.
- Organização: Mais fácil de encontrar e consertar bugs em arquivos pequenos.
- Manutenção: Alterar o estilo de um componente reflete em todas as suas instâncias.
2. Hierarquia de Componentes (Mermaid) 📊
graph TD
App[App.svelte] --> Nav[Navbar.svelte]
App --> Hero[HeroSection.svelte]
App --> List[ProductList.svelte]
List --> Item1[ProductCard.svelte]
List --> Item2[ProductCard.svelte]
List --> Item3[ProductCard.svelte]
App --> Foot[Footer.svelte]
3. Criando e Importando Componentes 📥
Para usar um componente dentro de outro, precisamos importá-lo na seção <script>.
<script>
import Header from './Header.svelte';
import Button from './lib/Button.svelte';
</script>
<Header />
<main>
<p>Conteúdo principal aqui.</p>
<Button />
</main>
4. Passando Dados via Props (Props) 🎁
As Props (propriedades) permitem que o componente pai envie informações para o componente filho. No Svelte, declaramos uma prop usando a palavra-chave export.
No filho (Card.svelte):
<script>
export let titulo = "Título Padrão";
export let preco;
</script>
<div class="card">
<h2>{titulo}</h2>
<p>Preço: R$ {preco}</p>
</div>
No pai (App.svelte):
Conceito
O export let torna a variável "pública", permitindo que quem usa o componente defina seu valor.
5. Slots: Injetando Conteúdo 📥
Às vezes queremos que o componente seja um "container" para outros elementos. Usamos a tag <slot /> para isso.
<!-- Box.svelte -->
<div class="box">
<slot></slot> <!-- O conteúdo do pai aparecerá aqui -->
</div>
6. Mini-Projeto: Galeria de Cards 🚀
Vamos colocar em prática:
1. Crie um novo arquivo chamado Card.svelte na pasta lib.
2. Defina props para nome, imagem e descricao.
3. No seu App.svelte, importe este componente.
4. Renderize três instâncias do Card com informações de linguagens de programação diferentes.
Dica
Use nomes de arquivos com a primeira letra maiúscula (PascalCase) para componentes, ex: MeuComponente.svelte. Isso é uma convenção forte no mundo Svelte!
7. Exercício de Fixação 📝
- Qual o comando no Svelte para transformar uma variável em uma Prop?
- Como você importa um componente chamado
Footer.svelteque está na mesma pasta? - Para que serve a tag
<slot />?
Próxima Aula: Vamos aprender a lidar com listas e condições usando Loops e Condicionais! 🔁
Aula 06 - Loops e Condicionais 🔁
Objetivo
Objetivo: Aprender a controlar o que aparece na tela usando lógica condicional e como exibir listas de dados de forma dinâmica e eficiente.
1. Renderização Condicional {#if} ❓
No Svelte, não usamos if dentro de tags de script para esconder elementos. Usamos blocos lógicos diretamente no HTML. Eles sempre começam com # e terminam com /.
<script>
let logado = false;
</script>
{#if logado}
<h1>Bem-vindo de volta!</h1>
<button on:click={() => logado = false}>Sair</button>
{:else}
<h1>Por favor, faça login.</h1>
<button on:click={() => logado = true}>Entrar</button>
{/if}
2. Lógica de Decisão (Mermaid) 📊
graph TD
A[Início do Bloco #if] --> B{Condição é verdadeira?}
B -- Sim --> C[Renderiza conteúdo do IF]
B -- Não --> D[Renderiza conteúdo do ELSE]
C --> E[Fim do Bloco /if]
D --> E
3. Iterando Listas com {#each} 📄
Para exibir uma lista de itens (como produtos ou tarefas), usamos o bloco {#each}.
<script>
let frutas = ["Maçã", "Banana", "Morango", "Uva"];
</script>
<ul>
{#each frutas as fruta}
<li>{fruta}</li>
{/each}
</ul>
Nota
Você também pode pegar o índice do item na lista: {#each frutas as fruta, i}. O i será 0, 1, 2...
4. O Fluxo de uma Lista Dinâmica 💻
<div id="termynal" data-termynal>
<span data-ty="input">let tarefas = ['Estudar', 'Cozinhar']</span>
<span data-ty="input">tarefas = [...tarefas, 'Dormir']</span>
<span data-ty="progress"></span>
<span data-ty># Svelte atualiza o DOM instantaneamente!</span>
</div>
5. Chaves nos Loops (Keyed each) 🔑
Sempre que a sua lista mudar (itens removidos ou reordenados), o Svelte precisa de uma forma de identificar cada item de forma única para manter a performance. Usamos um parêntese para passar a chave.
Dica de Performance
Sempre use uma chave única (como um ID do banco de dados) em vez do índice i se a sua lista puder ser alterada.
6. Mini-Projeto: Lista de Compras Inteligente 🚀
Sua missão:
1. Crie uma variável itensCompra que seja um array de objetos (ex: {id: 1, nome: 'Café', comprado: false}).
2. Use um {#each} para listar esses itens.
3. Use um {#if} dentro do loop para mostrar um emoji de "✅" se o item estiver comprado ou "❌" se não estiver.
4. Adicione um botão "Alternar" que mude o estado de comprado do item.
7. Exercício de Fixação 📝
- Como se fecha um bloco
{#if}no Svelte? - Qual a sintaxe para percorrer uma lista de
usuariose mostrar onomede cada um? - Para que serve a "chave" em um bloco
{#each}?
Próxima Aula: Vamos aprender a interagir com o usuário através de Eventos e Formulários! ⌨️
Aula 07 - Eventos e Formulários ⌨️
Objetivo
Objetivo: Aprender a capturar interações do usuário, manipular eventos do DOM e dominar o Two-way Binding para criar formulários reativos e inteligentes.
1. Escutando Eventos com on: 👂
No Svelte, para escutar qualquer evento do DOM (como clique, movimento do mouse ou digitação), usamos a diretiva on:.
<script>
let contador = 0;
function incrementar() {
contador += 1;
}
</script>
<!-- Chamando uma função -->
<button on:click={incrementar}>
Cliques: {contador}
</button>
<!-- Código inline -->
<button on:mouseenter={() => console.log('Mouse entrou!')}>
Passe o mouse
</button>
2. Modificadores de Evento 🛠️
O Svelte facilita a vida permitindo adicionar modificadores aos eventos usando o caractere |.
on:click|once: O evento só dispara uma vez.on:submit|preventDefault: Impede que a página recarregue ao enviar um formulário.on:click|stopPropagation: Evita que o evento suba para os elementos pais.
3. Two-way Binding (bind:value) 🔄
Normalmente, a informação flui do JavaScript para o HTML. Com o bind:, fazemos a informação fluir nos dois sentidos. Se o usuário digita no input, a variável muda. Se a variável mudar no código, o input atualiza.
Fluxo de Dados (Mermaid)
graph LR
subgraph "One-way (Padrão)"
JS1[Variável JS] -- "Atualiza" --> UI1[Interface]
end
subgraph "Two-way (bind:value)"
JS2[Variável JS] <--> UI2[Interface / Input]
end
<script>
let nome = "";
</script>
<input type="text" bind:value={nome} placeholder="Digite seu nome" />
<p>Seu nome é: {nome}</p>
4. Trabalhando com Grupos (Checkboxes e Radios) 🔘
O Svelte torna o trabalho com múltiplos inputs muito simples:
<script>
let sabores = []; // Array para múltiplos checkboxes
let tamanho = "M"; // String para rádio único
</script>
<label>
<input type="radio" bind:group={tamanho} value="P" /> Pequeno
</label>
<label>
<input type="radio" bind:group={tamanho} value="M" /> Médio
</label>
<p>Tamanho selecionado: {tamanho}</p>
5. Simulação de Formulário em Tempo Real 💻
<div id="termynal" data-termynal>
<span data-ty="input">bind:value={email}</span>
<span data-ty="progress"></span>
<span data-ty># Digitando: r... i... c...</span>
<span data-ty>email = 'ricardo@'</span>
<span data-ty># Svelte valida instantaneamente!</span>
</div>
6. Mini-Projeto: Cadastro de Perfil 🚀
Sua missão hoje:
1. Crie um formulário com campos para nome, email e biografia (textarea).
2. Adicione um seletor (select) para o cargo (ex: Estudante, Professor, Desenvolvedor).
3. Use o bind:value em todos os campos.
4. Exiba abaixo do formulário um "Preview" do perfil que atualiza enquanto o usuário digita.
5. Adicione um botão de "Salvar" que limpe as variáveis ao ser clicado.
Atenção
Sempre use bind:value com cuidado em campos muito grandes para evitar problemas de performance, embora o Svelte lide muito bem com isso na maioria dos casos.
7. Exercício de Fixação 📝
- Como você impediria um formulário de recarregar a página ao ser enviado?
- Qual a diferença entre usar
{valor}ebind:value={valor}em um input? - Como capturamos vários valores selecionados em um grupo de checkboxes?
Próxima Aula: Vamos deixar tudo bonito com Estilização e Escopo de CSS! 🎨
Aula 08 - Estilização e Escopo de CSS 🎨
Objetivo
Objetivo: Entender como o Svelte isola estilos automaticamente, aprender a criar estilos globais quando necessário e dominar o uso de classes CSS dinâmicas.
1. CSS Escopado (Local) 🛡️
A característica mais amada do Svelte em relação ao estilo é o Escopo de CSS. Por padrão, qualquer estilo escrito dentro da tag <style> de um componente só afeta aquele componente.
Como funciona?
O Svelte adiciona uma classe única (ex: svelte-xyz123) a todos os elementos do seu componente e aos seus seletores CSS durante a compilação.
2. Visualizando o Escopo (Mermaid) 📊
graph TD
A[Código Svelte] --> B{Compilador}
B -- "HTML" --> C["p class='svelte-abc123'"]
B -- "CSS" --> D["p.svelte-abc123 { color: blue }"]
subgraph "Navegador"
C
D
end
3. O Escopo Local na Prática 💻
<div id="termynal" data-termynal>
<span data-ty="input"># O Svelte transforma seu CSS</span>
<span data-ty="progress"></span>
<span data-ty>.btn { color: red }</span>
<span data-ty># vira:</span>
<span data-ty>.btn.svelte-hash { color: red }</span>
</div>
4. Estilos Globais 🌍
Às vezes, você quer que um estilo afete elementos fora do componente ou seletores de bibliotecas externas. Para isso, usamos o modificador :global().
<style>
/* Afeta todos os <h1> da aplicação */
:global(h1) {
font-family: 'Arial';
}
/* Afeta um .card mesmo se estiver dentro de um componente filho */
.container :global(.card) {
border: 1px solid silver;
}
</style>
5. Classes Condicionais 💡
O Svelte oferece um atalho sensacional para adicionar ou remover classes baseadas em uma condição: a diretiva class:nome.
<script>
let ativo = true;
</script>
<style>
.destaque {
background-color: yellow;
font-weight: bold;
}
</style>
<!-- Se 'ativo' for true, a classe 'destaque' é aplicada -->
<button
class:destaque={ativo}
on:click={() => ativo = !ativo}
>
Alternar Destaque
</button>
6. Mini-Projeto: Toggle de Tema 🚀
Vamos criar um pequeno sistema de temas:
1. No seu componente, crie uma variável modoNoturno (booleano).
2. No <style>, defina uma classe .dark com fundo preto e texto branco.
3. No markup, use class:dark={modoNoturno} em uma div que envolva todo o conteúdo.
4. Crie um botão que inverta o valor de modoNoturno.
5. Adicione uma transição suave de cor usando CSS padrão.
Dica de Ouro
As variáveis CSS (--minha-cor) funcionam perfeitamente no Svelte e são ótimas para passar valores do JavaScript para o CSS de forma reativa!
7. Exercício de Fixação 📝
- Por que é seguro usar seletores simples como
pouh1no Svelte? - Como você aplicaria um estilo a um elemento que não pertence ao componente atual?
- Qual a vantagem da diretiva
class:nomeem relação à interpolação manual de classes?
Próxima Aula: Entrando no Módulo 3! Vamos aprender sobre o Roteamento SPA na Prática! 🗺️
Aula 09 - Roteamento SPA na Prática 🗺️
Objetivo
Objetivo: Compreender como funciona a navegação em uma Single Page Application, configurar rotas dinâmicas e aprender a transicionar entre páginas sem recarregar o navegador.
1. O que é Roteamento SPA? 🧭
Em um site tradicional, cada link leva a um novo arquivo HTML. Em uma SPA (Single Page Application), existe apenas um index.html. O roteador é o responsável por decidir qual componente mostrar baseado na URL que está no navegador.
Vantagens:
- Velocidade: A transição é instantânea pois o HTML base já está carregado.
- Estado Preservado: Você pode manter dados (como um player de música) tocando enquanto navega.
2. Fluxo de Navegação SPA (Mermaid) 📊
graph TD
A[Usuário clica em Link] --> B[Roteador intercepta o clique]
B --> C[URL muda no navegador]
C --> D{Existe rota definida?}
D -- Sim --> E[Destrói componente antigo]
E --> F[Renderiza componente novo]
D -- Não --> G[Mostra Página 404]
3. Instalando um Roteador 💻
No Svelte puro, uma das opções mais simples e robustas para SPAs é o svelte-spa-router.
<div id="termynal" data-termynal>
<span data-ty="input">npm install svelte-spa-router</span>
<span data-ty="progress"></span>
<span data-ty>✔ Pacote instalado com sucesso!</span>
</div>
4. Configurando as Rotas 🛠️
Para configurar, criamos um mapa que liga "Caminhos" a "Componentes".
<script>
import Router from 'svelte-spa-router';
import Home from './routes/Home.svelte';
import Sobre from './routes/Sobre.svelte';
import NotFound from './routes/NotFound.svelte';
const routes = {
'/': Home,
'/sobre': Sobre,
'*': NotFound // Rota curinga para 404
};
</script>
<Router {routes} />
5. Navegação e Links 🔗
Para navegar, usamos links comuns, mas com uma diretiva especial para garantir que o roteador trate o clique sem recarregar a página.
<script>
import { link } from 'svelte-spa-router';
</script>
<nav>
<a href="/" use:link>Início</a>
<a href="/sobre" use:link>Sobre</a>
</nav>
Conceito
A diretiva use:link evita o comportamento padrão do navegador de recarregar a página completa.
6. Mini-Projeto: Mini Blog SPA 🚀
Sua missão:
1. Instale o svelte-spa-router.
2. Crie uma pasta src/routes.
3. Crie os componentes Home.svelte e Sobre.svelte dentro dessa pasta.
4. No App.svelte, configure o roteador e crie um menu de navegação simples.
5. Adicione um componente NotFound.svelte para lidar com caminhos inexistentes.
Dica
Você pode passar parâmetros na URL como /perfil/:id. O roteador entregará o id para o componente automaticamente!
7. Exercício de Fixação 📝
- Por que a página não "pisca" branco ao navegar em uma SPA?
- Qual a função da rota
*no objeto de configuração? - Como o roteador sabe qual componente exibir se só existe um arquivo
index.html?
Próxima Aula: Vamos aprender a compartilhar dados entre componentes distantes com Stores e Estado! 📦
Aula 10 - Stores e Gerenciamento de Estado 📦
Objetivo
Objetivo: Aprender a compartilhar dados entre componentes distantes sem "perfurar" a hierarquia com Props, dominando o uso das Svelte Stores para gerenciar o estado global da aplicação.
1. O Problema: Prop Drilling 🪚
Quando um dado precisa sair do topo da aplicação e chegar a um componente muito profundo, temos que passar esse dado por todos os componentes intermediários. Isso se chama Prop Drilling e torna o código difícil de manter.
A Solução: Stores
Uma Store é um objeto que guarda um valor e permite que qualquer componente da aplicação se "inscreva" para receber atualizações quando esse valor mudar.
2. Writable Stores: O Coração do Estado 💓
A writable store permite que você leia e escreva dados.
Como manipular:
.set(val): Define um novo valor..update(n => n + 1): Atualiza baseado no valor atual..subscribe(val => ...): Escuta as mudanças.
3. Fluxo de Dados com Store (Mermaid) 📊
graph LR
S[Store Global] --> C1[Componente A]
S --> C2[Componente B]
S --> C3[Componente C]
C2 -- "Atualiza Dado" --> S
S -- "Notifica todos" --> C1
S -- "Notifica todos" --> C3
4. O Atalho Mágico: O Cifrão $ ✨
Abrir e fechar inscrições manualmente com .subscribe dá trabalho e pode causar vazamento de memória. O Svelte tem um atalho: basta colocar um $ na frente do nome da store no HTML ou script.
<script>
import { contador } from './store.js';
</script>
<h1>O valor atual é: {$contador}</h1>
<button on:click={() => $contador++}>Incrementar</button>
Conceito
O $ faz o Auto-subscription: ele se inscreve quando o componente aparece e se desinscreve automaticamente quando o componente é destruído.
5. Criando e Usando uma Store 💻
<div id="termynal" data-termynal>
<span data-ty="input">import { writable } from 'svelte/store';</span>
<span data-ty="input">export const user = writable({name: 'Visitante'});</span>
<span data-ty="progress"></span>
<span data-ty># No componente:</span>
<span data-ty>$user = {name: 'Ricardo'};</span>
</div>
6. Mini-Projeto: Carrinho de Compras Global 🚀
Sua missão:
1. Crie um arquivo cartStore.js e exporte uma writable store chamada carrinho (iniciando como um array vazio).
2. No componente Produto.svelte, adicione um botão que dê um update na store adicionando um novo item.
3. No componente Navbar.svelte, exiba o total de itens no carrinho usando {$carrinho.length}.
4. Certifique-se de que, ao adicionar um produto, o número na Navbar atualize instantaneamente!
Dica
Você também pode criar Derived Stores (Lojas Derivadas) que dependem de outras stores. Ex: uma store totalPreco que calcula a soma de tudo que está no carrinho.
7. Exercício de Fixação 📝
- O que é Prop Drilling e como as Stores resolvem isso?
- Diferencie os métodos
.set()e.update()de uma writable store. - Qual a importância de usar o prefixo
$ao acessar uma store em um componente?
Próxima Aula: Vamos conectar nosso app ao mundo real com o Consumo de API REST! 🌐
Aula 11 - Consumo de API REST 🌐
Objetivo
Objetivo: Aprender a conectar sua aplicação Svelte ao mundo externo, realizando requisições HTTP para APIs reais, tratando estados de carregamento e erros de forma elegante com o bloco {#await}.
1. O que é uma API REST? 📡
Uma API (Application Programming Interface) permite que seu frontend "converse" com um servidor para buscar ou salvar dados. Usamos o protocolo HTTP e o formato JSON para essa conversa.
2. Fazendo requisições com fetch 🎣
O JavaScript moderno possui a função fetch nativa para fazer requisições. No Svelte, geralmente fazemos isso dentro de uma função async.
async function buscarDados() {
const resposta = await fetch('https://api.exemplo.com/dados');
if (resposta.ok) {
return await resposta.json();
} else {
throw new Error('Falha ao carregar dados');
}
}
3. Fluxo de Requisição Assíncrona (Mermaid) 📊
sequenceDiagram
participant B as Browser (Svelte)
participant A as API Externa
B->>B: Inicia Estado 'Carregando'
B->>A: GET /produtos
A-->>B: Retorna JSON (Produtos)
B->>B: Inicia Estado 'Sucesso'
B->>B: Renderiza Lista na UI
4. O Superpoder do Svelte: {#await} ⏳
Diferente de outros frameworks onde você precisa criar várias variáveis de estado (loading, error, data), o Svelte tem um bloco nativo que resolve tudo isso de uma vez.
<script>
let promessa = buscarDados();
</script>
{#await promessa}
<p>⏳ Carregando dados...</p>
{:then dados}
<ul>
{#each dados as item}
<li>{item.nome}</li>
{/each}
</ul>
{:catch erro}
<p style="color: red">❌ Erro: {erro.message}</p>
{/await}
5. Simulação de Chamada de API 💻
<div id="termynal" data-termynal>
<span data-ty="input"># Iniciando requisição para API...</span>
<span data-ty="progress"></span>
<span data-ty>GET https://api.api-ninjas.com/v1/quotes</span>
<span data-ty>Status: 200 OK</span>
<span data-ty># Dados recebidos! Atualizando a tela...</span>
</div>
6. Mini-Projeto: Gerador de Citações Aleatórias 🚀
Vamos colocar em prática:
1. Escolha uma API pública simples (ex: https://api.quotable.io/random ou https://dog.ceo/api/breeds/image/random).
2. No seu componente, crie uma função async que busque um dado dessa API.
3. Use o bloco {#await} para mostrar uma mensagem de carregamento e o resultado final.
4. Adicione um botão "Próxima" que chame a função novamente para atualizar o dado.
Dica
Ao clicar no botão "Próxima", basta fazer: promessa = buscarDados();. O Svelte detectará que a promessa mudou e voltará para o estado de carregamento automaticamente!
7. Exercício de Fixação 📝
- Para que serve a palavra-chave
awaitno JavaScript? - Quais são os três estados possíveis dentro de um bloco
{#await}? - Como o Svelte decide quando mostrar o bloco
{:then}?
Próxima Aula: Vamos construir uma aplicação completa com CRUD Completo e Integração! 🏗️
Aula 12 - CRUD Completo com API 🏗️
Objetivo
Objetivo: Consolidar os conhecimentos de componentes, eventos, binding e APIs para construir uma aplicação funcional completa (CRUD), lidando com a persistência de dados em um servidor.
1. O que é um CRUD? 📝
CRUD é um acrônimo para as quatro operações básicas de gerenciamento de dados:
* Create (Criar) -> POST
* Read (Ler/Listar) -> GET
* Update (Atualizar) -> PUT / PATCH
* Delete (Apagar) -> DELETE
2. Ciclo de Vida do CRUD em uma SPA (Mermaid) 📊
graph TD
A[Lista de Itens] -->|Clique em Novo| B[Formulário de Criação]
B -->|Submit POST| C{Servidor}
C -->|Sucesso| A
A -->|Clique em Editar| D[Formulário de Edição]
D -->|Submit PUT| C
A -->|Clique em Excluir| E[Confirmação]
E -->|Submit DELETE| C
3. Listagem e Exclusão 🗑️
Para listar, usamos o {#each}. Para excluir, chamamos uma função que faz o DELETE e atualiza a lista local.
async function excluir(id) {
const res = await fetch(`https://api.com/itens/${id}`, { method: 'DELETE' });
if (res.ok) {
// Remove da lista local para atualizar a tela instantaneamente
itens = itens.filter(i => i.id !== id);
}
}
4. Criação e Envio de JSON 📤
Ao criar um item, precisamos enviar o body da requisição como uma string JSON e definir o cabeçalho correto.
async function salvar() {
await fetch('https://api.com/itens', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ nome: novoNome })
});
// Recarregar a lista ou adicionar o item retornado
}
5. Simulação de Operação CRUD 💻
<div id="termynal" data-termynal>
<span data-ty="input"># Enviando novo registro...</span>
<span data-ty="progress"></span>
<span data-ty>POST /tasks { "title": "Aprender Svelte" }</span>
<span data-ty>Status: 201 Created</span>
<span data-ty># Item adicionado com sucesso!</span>
</div>
6. Mini-Projeto: Gerenciador de Contatos 🚀
Vamos construir um sistema de contatos completo:
1. Listagem: Busque uma lista de contatos de uma API de testes (ex: JSONPlaceholder).
2. Criação: Adicione um formulário no topo para inserir o nome e telefone.
3. Remoção: Cada contato na lista deve ter um botão "Excluir".
4. Feedback: Mostre um aviso de "Salvando..." enquanto a API processa o pedido.
Dica de UX
Após uma operação de sucesso (como deletar), você pode simplesmente filtrar o array local em vez de fazer uma nova requisição GET. Isso deixa a aplicação muito mais rápida para o usuário!
7. Exercício de Fixação 📝
- Quais os métodos HTTP correspondentes a cada letra do acrônimo CRUD?
- Por que precisamos do header
Content-Type: application/jsonao enviar dados? - Como você atualizaria um item da lista local após receber a confirmação de sucesso do servidor?
Próxima Aula: Vamos entender como otimizar a performance com o Ciclo de Vida e Performance! 🚀
Aula 13 - Ciclo de Vida e Performance ⏳
Objetivo
Objetivo: Entender os momentos em que um componente "nasce", "vive" e "morre" no navegador, e como usar as funções de ciclo de vida para gerenciar recursos e otimizar a performance da aplicação.
1. O que é o Ciclo de Vida? 🧬
Todo componente no Svelte passa por fases. Conhecer essas fases permite que você execute código no momento exato (ex: buscar dados assim que o usuário entra na página).
As principais funções:
onMount: Executa logo após o componente ser renderizado pela primeira vez no DOM.onDestroy: Executa logo antes do componente ser destruído (removido da tela).beforeUpdate: Executa momentos antes do DOM ser atualizado.afterUpdate: Executa logo após o DOM ser sincronizado com os dados.
2. Fases do Componente (Mermaid) 📊
graph TD
A[Início] --> B[Script Executado]
B --> C[Renderização Initial]
C --> D[onMount]
D --> E{Dados mudaram?}
E -- Sim --> F[beforeUpdate]
F --> G[Sincroniza DOM]
G --> H[afterUpdate]
H --> E
E -- Não --> I[Componente removido]
I --> J[onDestroy]
J --> K[Fim]
3. O Poder do onMount 🔌
O onMount é a função mais utilizada. É o lugar perfeito para:
* Fazer chamadas de API.
* Interagir com bibliotecas externas (como mapas ou gráficos).
* Focar em um campo de input automaticamente.
<script>
import { onMount } from 'svelte';
onMount(() => {
console.log("O componente está pronto!");
// Código de inicialização aqui
});
</script>
4. Limpeza e Performance com onDestroy 🧹
Muitos bugs e lentidões acontecem porque esquecemos de "limpar" a bagunça ao sair de uma página.
import { onDestroy } from 'svelte';
const intervalo = setInterval(() => {
console.log('Rodando...');
}, 1000);
// Se não limparmos, o intervalo continuará rodando para sempre!
onDestroy(() => {
clearInterval(intervalo);
});
5. Simulação de Ciclo de Vida 💻
<div id="termynal" data-termynal>
<span data-ty="input"># Componente carregado no DOM</span>
<span data-ty="progress"></span>
<span data-ty>onMount executado!</span>
<span data-ty="input"># Usuário mudou de rota</span>
<span data-ty>onDestroy: Limpando memória...</span>
<span data-ty>✔ Componente removido com segurança.</span>
</div>
6. Mini-Projeto: Monitor de Performance (Timer) 🚀
Sua missão hoje:
1. Crie um componente que exiba um cronômetro na tela (segundos passando).
2. Use um setInterval iniciado dentro de uma função.
3. Garanta que o cronômetro pare e limpe o intervalo ao sair do componente usando onDestroy.
4. Adicione um onMount que mostre um alert("Bem-vindo ao Timer!") apenas uma vez.
Atenção
Não limpar timers ou listeners de eventos pode causar Memory Leaks, fazendo seu site ficar lento ou até travar o navegador do usuário após algum tempo de uso.
7. Exercício de Fixação 📝
- Qual a diferença entre o script principal do componente e a função
onMount? - Por que devemos usar
onDestroyao trabalhar comsetIntervalouaddEventListenerglobais? - Quando o
afterUpdateé disparado?
Próxima Aula: Vamos subir o nível com Boas Práticas e Arquitetura Frontend! 🏛️
Aula 14 - Boas Práticas e Arquitetura Frontend 🏛️
Objetivo
Objetivo: Elevar o nível do seu código frontend aplicando princípios de Clean Code, organizando seu projeto de forma profissional e garantindo que sua aplicação seja fácil de escalar e manter.
1. Organização de Pastas Profissional 📂
À medida que o seu app cresce, colocar tudo em src vira um caos. Uma arquitetura padrão ajuda a equipe a se localizar.
Estrutura Sugerida:
src/lib/: Componentes reutilizáveis (botões, inputs, cards).src/routes/: Componentes que representam páginas inteiras.src/stores/: Arquivos de gerenciamento de estado global.src/assets/: Imagens, fontes e CSS global.src/utils/: Funções auxiliares (formatadores de data, validadores).
2. Arquitetura de Projeto Svelte (Mermaid) 📊
graph TD
A[App.svelte] --> R[Routes]
R --> P1[Home.svelte]
R --> P2[Perfil.svelte]
P1 --> C[Components /lib]
P2 --> C
C --> S[Stores]
P1 --> S
P2 --> S
3. Padronização de Código (Naming) ✏️
- Componentes: Use
PascalCase.svelte(ex:UserCard.svelte). - Variáveis e Funções: Use
camelCase(ex:let isLoading = true). - Stores: Use nomes descritivos (ex:
authStore.js). - Pastas: Use
kebab-caseoucamelCase(ex:user-profile/).
4. Separação de Interesses (SOC) 🧠
Evite colocar lógica pesada de JavaScript dentro do HTML. Se uma função tem mais de 10 linhas, considere movê-la para um arquivo .js separado na pasta utils.
Princípio DRY
Don't Repeat Yourself: Se você está copiando e colando o mesmo código em três componentes, transforme esse código em um componente reutilizável ou em uma função utilitária.
5. Dica de Performance: Lazy Loading 💻
Não carregue tudo de uma vez. Carregue apenas o que o usuário vai ver.
// Exemplo de carregamento dinâmico de componente (conceitual)
const MeuComponentePesado = async () => (await import('./Pesado.svelte')).default;
6. Mini-Projeto: Refatorando o Caos 🚀
Sua missão:
1. Pegue o código de um dos mini-projetos anteriores.
2. Mova as funções de formatação de data ou moeda para um arquivo src/utils/formatters.js.
3. Mova o componente principal para src/routes/Main.svelte.
4. Certifique-se de que todos os imports continuam funcionando.
5. O App.svelte agora deve ser apenas o "orquestrador", importando o roteador ou o componente principal.
Dica
Um componente "limpo" deve ser lido como um livro. O <script> conta a história (lógica), o markup mostra a cena (estrutura) e o <style> dá o tom (aparência).
7. Exercício de Fixação 📝
- Por que devemos separar componentes em uma pasta
liboucomponents? - O que significa o acrônimo SoC (Separation of Concerns)?
- Como o Clean Code ajuda no trabalho em equipe em um projeto frontend?
Próxima Aula: Hora de colocar o site no ar! Build, Deploy e Produção! 🚀
Aula 15 - Build, Deploy e Produção 🚀
Objetivo
Objetivo: Aprender a transformar seu código de desenvolvimento em um pacote otimizado para produção, gerenciar segredos com variáveis de ambiente e colocar sua aplicação no ar para o mundo todo ver.
1. O que é o Build de Produção? 🏗️
Durante o desenvolvimento (npm run dev), o Vite prioriza a velocidade e facilita o seu trabalho. Para o usuário final, precisamos priorizar a performance e o tamanho do arquivo.
O comando npm run build faz:
* Minificação: Remove espaços e encurta nomes de variáveis.
* Tree Shaking: Remove código que não está sendo usado.
* Otimização de Imagens: Reduz o peso dos arquivos estáticos.
2. Diferença entre Dev e Prod (Mermaid) 📊
graph LR
subgraph "Desenvolvimento (Local)"
D1[Código Sujo] --> D2[Vite Dev Server]
D2 --> D3[Navegador]
end
subgraph "Produção (Mundo)"
P1[Código Limpo] -- "npm run build" --> P2[Pasta /dist]
P2 -- "Upload" --> P3[Servidor Web / CDN]
P3 --> P4[Usuário Final]
end
3. Variáveis de Ambiente (.env) 🔐
Nunca coloque senhas ou chaves de API diretamente no código. Use arquivos .env. No Svelte (via Vite), as variáveis devem começar com VITE_.
4. Rodando o Build Localmente 💻
<div id="termynal" data-termynal>
<span data-ty="input">npm run build</span>
<span data-ty="progress"></span>
<span data-ty>✔ Vite v5.0.0 built in 1.4s</span>
<span data-ty># Uma pasta /dist foi criada!</span>
<span data-ty="input">npm run preview</span>
<span data-ty># Testando a versão final no localhost:4173</span>
</div>
5. Onde hospedar meu App? 🌍
Existem serviços que fazem o deploy automático assim que você envia o código para o GitHub:
- Vercel / Netlify: Os favoritos para Svelte. Basta conectar o repositório e pronto.
- GitHub Pages: Ótimo para sites estáticos e portfólios.
- Hospedagem Comum: Você pode apenas dar upload na pasta
/distvia FTP.
Nota
A maioria desses serviços oferece um plano gratuito vitalício para projetos pequenos e estudantes.
6. Mini-Projeto: Launch Day 🚀
Sua missão final antes do projeto: 1. Crie um repositório no GitHub para o seu projeto atual. 2. Crie uma conta na Vercel ou Netlify. 3. Conecte seu repositório do GitHub ao serviço escolhido. 4. Veja o build acontecer automaticamente e compartilhe o link do seu site!
Dica de Segurança
Adicione o arquivo .env ao seu .gitignore. Você deve configurar as variáveis de ambiente manualmente no painel de controle da Vercel/Netlify.
7. Exercício de Fixação 📝
- Qual a função da pasta
/distgerada após o build? - Por que devemos prefixar variáveis de ambiente com
VITE_? - O que é "Minificação" e como ela ajuda o usuário final?
Próxima Aula: O grande encerramento! Projeto Final do Curso 🏆
Aula 16 - Projeto Final 🏆
Objetivo
Objetivo: Aplicar TODO o conhecimento adquirido (Reatividade, Componentes, Stores, Roteamento e APIs) para construir uma aplicação web robusta, funcional e profissional utilizando Svelte.
1. O Desafio: "Svelte Connect" 🚀
Chegou a hora de consolidar seu aprendizado. Você deve escolher um dos temas abaixo para desenvolver sua aplicação final:
📑 Sistema de Tarefas (Task Manager)
- Funcionalidades: Login, criar categorias, adicionar/remover tarefas, marcar como concluído e salvar tudo em uma API.
📊 Dashboard Administrativo
- Funcionalidades: Visualização de métricas (gráficos), listagem de usuários de uma API, edição de perfis e controle de tema (Dark Mode).
🛒 Pequeno E-commerce
- Funcionalidades: Catálogo de produtos vindo de API, filtro por categoria, carrinho de compras (Store) e resumo do pedido.
2. Mapa Mental do Curso (Mermaid) 📊
mindmap
root((Svelte Master))
Fundamentos
Compilação
Sintaxe .svelte
Reatividade
UI e Componentes
Props
Slots
Eventos e Binding
Estilo Escopado
Ecossistema
Roteamento SPA
Svelte Stores
Fetch API
Produção
Arquitetura
Build e Otimização
Deploy
3. Requisitos Obrigatórios 📋
Seu projeto deve conter pelo menos: - [ ] Componentização: Mínimo de 5 componentes reutilizáveis. - [ ] Reatividade: Uso de declarações reativas ($:) e binding de formulários. - [ ] Estado Global: Pelo menos uma Svelte Store (ex: Carrinho ou Perfil do Usuário). - [ ] Consumo de API: Realizar pelo menos uma operação de GET e uma de POST/PUT/DELETE. - [ ] Roteamento: Uso de roteador SPA com pelo menos 3 rotas diferentes. - [ ] Estilização: Uso correto de escopo de CSS e um layout responsivo (mobile-friendly).
4. Dicas para Excelência ✨
- UX/UI: Use o que você aprendeu em Design para criar algo "limpo" e atraente.
- Tratamento de Erros: Se a API falhar, não deixe a tela em branco! Mostre uma mensagem amigável para o usuário.
- README: Capriche na documentação do projeto no GitHub.
- Performance: Verifique no
onDestroyse você limpou todos os recursos necessários.
5. Conclusão da Jornada 🎓
<div id="termynal" data-termynal>
<span data-ty="input"># Finalizando o curso de Svelte...</span>
<span data-ty="progress"></span>
<span data-ty>✔ Módulo de Fundamentos Concluído</span>
<span data-ty>✔ Módulo de Arquitetura Concluído</span>
<span data-ty>✔ Projeto Final Publicado</span>
<span data-ty>🚀 Parabéns, Desenvolvedor Svelte!</span>
</div>
6. Onde continuar? 📚
O Svelte é uma porta de entrada. Para os próximos passos, recomendamos: 1. SvelteKit: O framework Full-Stack oficial para aplicações de grande escala. 2. TypeScript: Para adicionar tipagem e segurança ao seu código. 3. Tailwind CSS: Para uma estilização rápida e moderna.
Mensagem Final
Dominar o Svelte é entender que o navegador deve trabalhar menos para o usuário ver mais. Continue praticando e construindo interfaces incríveis!
FIM DO CURSO 🚀🚀🚀 Desejamos muito sucesso na sua jornada como Desenvolvedor Frontend!
Exercícios
Exercícios Práticos 📝
Lista de exercícios para fixação de conceitos, divididos por aula.
-
Módulo 1 ---
-
Módulo 2 ---
-
Módulo 3 ---
-
Módulo 4 ---
Exercícios 01 - Introdução ao Frontend Moderno 🌐
🟢 Básicos
- Conceito: Diferencie MPA (Multi-Page Application) de SPA (Single Page Application) com suas palavras.
- História: Por que o surgimento do AJAX foi tão importante para a evolução das interfaces web?
🟡 Intermediários
- Processamento: Em uma SPA, onde ocorre a maior parte do processamento da interface? No servidor ou no navegador do cliente? Justifique.
- Reatividade: Explique o que acontece com a interface de um framework reativo quando o valor de uma variável vinculada a ela é alterado.
🔴 Desafio
- Análise Comparativa:
Imagine que você está criando um site de notícias simples (apenas texto e imagens estáticas) e um painel de controle de uma corretora de valores (dados mudando a cada segundo).
- Qual modelo (MPA ou SPA) você escolheria para cada um?
- Quais seriam os prós e contras de usar uma SPA para o site de notícias em termos de SEO?
Exercícios 02 - Introdução ao Svelte 🏗️
🟢 Básicos
- Diferencial: Qual a principal diferença entre o Svelte e frameworks como React ou Vue em relação ao seu funcionamento?
- Vite: Quais as vantagens de usar o Vite para criar um projeto Svelte em vez de ferramentas mais antigas?
🟡 Intermediários
- Compilação: Explique por que o fato de o Svelte ser um "compilador" faz com que o pacote final enviado ao usuário seja menor.
- Virtual DOM: O Svelte utiliza Virtual DOM? Explique como ele atualiza as informações na tela de forma diferente.
🔴 Desafio
- Hands-on - Primeiro Projeto:
- Use o comando
npm create vite@latestpara criar seu primeiro projeto Svelte. - Navegue até a pasta, instale as dependências e rode o projeto.
- Abra o arquivo
App.svelte, mude o texto do título para "Meu Primeiro App Svelte" e verifique a atualização instantânea no navegador. - Qual arquivo é o "ponto de entrada" (entry point) do JavaScript na estrutura gerada pelo Vite?
- Use o comando
Exercícios 03 - Estrutura de Projeto e Sintaxe Básica 🧱
🟢 Básicos
- Anatomia: Quais são as 3 seções principais que compõem um arquivo
.svelte? - Interpolação: Como exibimos o valor de uma variável JavaScript dentro do HTML no Svelte?
🟡 Intermediários
- Atributos Dinâmicos: Como você passaria o valor de uma variável chamada
caminhoImagempara o atributosrcde uma tag<img>? - Lógica no Script: Dentro da tag
<script>, crie uma variávelnomee uma funçãodizerOla()que imprima uma mensagem no console usando essa variável.
🔴 Desafio
- Mini-Componente de Perfil:
- Crie um arquivo
App.svelteque tenha variáveis paranome,idadeeprofissao. - No HTML (markup), exiba esses dados dentro de uma
divcom classecard. - Adicione um estilo básico na tag
<style>para que ocardtenha uma borda, sombra e um pouco de espaçamento (padding). - O que acontece se você declarar uma variável com
letmas não usá-la em lugar nenhum do HTML? O Svelte dá algum aviso?
- Crie um arquivo
Exercícios 04 - Reatividade no Svelte ⚡
🟢 Básicos
- Gatilho: O que dispara uma atualização automática na interface do Svelte? (Dica: pense no operador
=). - Sintaxe $:: Para que serve o prefixo
$:no Svelte?
🟡 Intermediários
- Variáveis Dependentes: Crie um exemplo de código onde uma variável
totalé sempre igual à soma deprecoetaxa, usando reatividade. - Logs Reativos: Como você usaria a sintaxe
$:para imprimir o valor de uma variável no console toda vez que ela mudar?
🔴 Desafio
- Lógica de Negócio Reativa:
Crie um componente que simule um carrinho de compras simples:
- Tenha uma variável
quantidade(inicie em 1) e uma variávelprecoUnitario(ex: 50.0). - Crie uma variável reativa
subtotalque calcule o preço total. - Crie um bloco reativo
$: { ... }que verifique: se osubtotalpassar de 100, exiba um aviso (pode ser um texto na tela ou um console.log) dizendo "Você ganhou frete grátis!". - Adicione botões para aumentar e diminuir a quantidade.
- Tenha uma variável
Exercícios 05 - Componentização 🧩
🟢 Básicos
- Conceito: Por que dividir uma aplicação em componentes é melhor do que ter um único arquivo gigante?
- Importação: Escreva a linha de código necessária para importar um componente chamado
Header.svelteque está dentro da pastalib.
🟡 Intermediários
- Props: Como você declara uma variável em um componente filho para que o componente pai possa enviar um valor para ela?
- Slots: Imagine que você criou um componente
Moldura.svelte. Como você faria para que qualquer conteúdo colocado dentro dele (como um texto ou outra imagem) apareça em um lugar específico do seu HTML?
🔴 Desafio
- Pai e Filho na Prática:
- Crie um componente chamado
Produto.svelte. - Ele deve receber 3 props:
nome,precoedisponivel(booleano). - No seu
App.svelte, use o componenteProdutotrês vezes, passando dados diferentes para cada um. - No componente
Produto, adicione um estilo que mude a cor do nome para cinza caso o produto não estejadisponivel.
- Crie um componente chamado
Exercícios 06 - Loops e Condicionais 🔁
🟢 Básicos
- Sintaxe If: Como iniciamos e como fechamos um bloco condicional
ifno Svelte? - Sintaxe Each: Escreva a estrutura básica de um bloco
eachpara percorrer uma lista chamadacores.
🟡 Intermediários
- Else If: Crie um exemplo de bloco condicional que verifique uma variável
notae exiba: "Aprovado" (> 7), "Recuperação" (entre 5 e 7) ou "Reprovado" (< 5). - Índice no Each: Como você faz para acessar a posição (índice 0, 1, 2...) de um item dentro de um loop
each?
🔴 Desafio
- Lista de Filmes Reativa:
- Crie um array de objetos chamado
filmes, onde cada objeto temtituloevisto(booleano). - Use um loop
{#each}para listar todos os filmes. - Use um
{#if}dentro do loop: se o filme já foi visto, risque o nome do filme (ou use um emoji ✅); se não, mostre um botão "Marcar como Visto". - Implemente a lógica do botão para que, ao clicar, o status
vistodesse filme mude paratruee a tela atualize.
- Crie um array de objetos chamado
Exercícios 07 - Eventos e Formulários ⌨️
🟢 Básicos
- Evento Click: Qual a diretiva usada para escutar um clique em um botão no Svelte?
- Input Binding: Para que serve a diretiva
bind:valuee qual a diferença entre ela e apenas passar uma variável para o atributovalue?
🟡 Intermediários
- Prevent Default: Como você impediria um formulário de recarregar a página ao ser enviado, usando apenas um modificador de evento do Svelte?
- Múltiplos Inputs: Imagine um conjunto de 3 botões do tipo "Radio" para escolher um tamanho (P, M, G). Como você vincularia todos eles a uma única variável chamada
tamanhoSelecionado?
🔴 Desafio
- Formulário de Feedback Dinâmico:
- Crie um formulário com um campo de
nomee umcomentario(textarea). - Crie uma variável reativa
contagemCaracteresque mostre quantos caracteres o usuário já digitou no comentário. - Impeça o botão "Enviar" de ser clicado (atribute
disabled) se o nome estiver vazio ou se o comentário tiver menos de 10 caracteres. - Ao enviar, exiba uma mensagem de sucesso na tela e limpe os campos.
- O que acontece se você remover o
bind:valuee tentar ler os dados através de uma função? Qual abordagem é mais simples no Svelte?
- Crie um formulário com um campo de
Exercícios 08 - Estilização e Escopo de CSS 🎨
🟢 Básicos
- Escopo: O que significa dizer que o CSS no Svelte é "escopado" por padrão?
- Global: Como você define uma regra CSS dentro de um componente para que ela afete elementos em toda a aplicação?
🟡 Intermediários
- Classes Condicionais: Escreva a sintaxe da diretiva
class:para aplicar a classeativoapenas se a variávelestaLigadofor verdadeira. - Variáveis CSS: Como você passaria o valor de uma variável JavaScript para uma propriedade CSS (ex:
background-color) de forma que ela mude dinamicamente?
🔴 Desafio
- Card de Tema Dinâmico:
- Crie um componente
CardNoticia.svelte. - Adicione uma prop chamada
urgente(booleano). - No
<style>, crie uma classe.perigocom fundo vermelho e texto branco. - Use a diretiva
class:perigopara que o card mude de aparência se a propurgentefor verdadeira. - Adicione uma animação de "piscar" (keyframes) que também só seja ativada caso a notícia seja urgente.
- Como o Svelte lida com seletores de ID (ex:
#meu-id) em comparação com seletores de classe? O escopo funciona da mesma forma?
- Crie um componente
Exercícios 09 - Roteamento SPA na Prática 🗺️
🟢 Básicos
- Definição: Por que uma SPA não recarrega a página ao clicar em um link interno?
- Instalação: Qual o comando para instalar o
svelte-spa-routerno seu projeto?
🟡 Intermediários
- Configuração: Como você define uma rota curinga (fallback) para exibir uma página "404 - Não Encontrado"?
- Links: Se você usar a tag
<a href="/sobre">, a página irá recarregar. O que deve ser adicionado a essa tag para que o roteador trate a navegação?
🔴 Desafio
- Sistema de Navegação Dinâmico:
- Crie um objeto
routesque tenha as páginas:Home,ContatoePerfil. - No componente
Perfil, use o parâmetro de rota para que a URL seja/perfil/:usuario. - Exiba na tela a mensagem: "Bem-vindo ao perfil de [usuario]!", onde
[usuario]vem da URL. - Crie um menu lateral (Sidebar) que use um loop
{#each}para gerar os links de navegação a partir de um array de objetos.
- Crie um objeto
Exercícios 10 - Stores e Gerenciamento de Estado 📦
🟢 Básicos
- Utilidade: Em qual situação é melhor usar uma Store em vez de passar dados via Props?
- Atalho: O que o caractere
$faz quando colocado antes do nome de uma store em um componente Svelte?
🟡 Intermediários
- Update vs Set: Quando você deve usar o método
.update()em vez do.set()em uma writable store? - Inscrição Manual: Escreva o código para se inscrever (subscribe) manualmente em uma store chamada
temae salvar o valor em uma variável local. Não esqueça de mencionar como você faria para "desinscrever".
🔴 Desafio
- Sistema de Autenticação Centralizado:
- Crie um arquivo
auth.jscom uma storeuserque guarda um objeto (pode iniciar comonull). - Crie dois componentes:
Login.svelteeDashboard.svelte. - No
Login, ao clicar em um botão, atualize a store com um usuário fictício (ex:{nome: 'Fulano', email: 'fulano@teste.com'}). - No
App.svelte, use um{#if $user}para alternar entre mostrar o Login ou o Dashboard. - No
Dashboard, exiba o nome do usuário vindo da store e adicione um botão "Logoff" que limpe a store.
- Crie um arquivo
Exercícios 11 - Consumo de API REST 🌐
🟢 Básicos
- Fetch: Qual o método HTTP padrão usado pela função
fetch()se você não especificar nenhum? - JSON: Por que precisamos chamar
.json()após receber a resposta de umfetch?
🟡 Intermediários
- Bloco Await: Escreva a estrutura básica do bloco
{#await}do Svelte, incluindo o estado de carregamento e o tratamento de erro. - Async/Await: Transforme uma sequência de
.then()e.catch()em uma função usando as palavras-chaveasynceawait.
🔴 Desafio
- Buscador de Personagens:
- Use a API pública do Rick and Morty (
https://rickandmortyapi.com/api/character). - Crie um input de texto para o usuário digitar um nome.
- Use o
{#await}para buscar os personagens que coincidam com esse nome sempre que o usuário clicar em um botão "Buscar". - Exiba a imagem e o nome do personagem retornado.
- Adicione uma verificação: se a API não encontrar nada, exiba "Nenhum personagem encontrado".
- Use a API pública do Rick and Morty (
Exercícios 12 - CRUD Completo com API 🏗️
🟢 Básicos
- CRUD: O que significa cada letra da sigla CRUD?
- Métodos HTTP: Quais métodos HTTP (GET, POST, etc) são usados para Criar e Atender (Ler) dados?
🟡 Intermediários
- Headers: Por que é necessário enviar o cabeçalho
Content-Type: application/jsonao realizar umPOSTpara uma API? - Refresh Local: Por que é uma boa prática filtrar a lista local ao deletar um item em vez de fazer uma nova requisição de "Listar tudo" ao servidor?
🔴 Desafio
- Gerenciador de Estoque:
- Imagine uma API de produtos:
https://api-estoque.com/produtos. - Escreva o código da função
salvarProduto(novoProduto)que faz umPOSTcom os dados do produto. - Escreva o código da função
atualizarPreco(id, novoPreco)que faz umPATCHenviando apenas o novo preço. - Como você lidaria com o estado de "Salvando..." no botão para evitar que o usuário clique duas vezes seguidas e envie dados duplicados?
- Imagine uma API de produtos:
Exercícios 13 - Ciclo de Vida e Performance ⏳
🟢 Básicos
- Mount: O que acontece quando o código é colocado dentro da função
onMount? - Destroy: Em qual momento a função
onDestroyé executada?
🟡 Intermediários
- Memória: Por que é perigoso deixar um
setIntervalrodando sem limpá-lo noonDestroy? - Atualização: Diferencie as funções
beforeUpdateeafterUpdate. Em que cenário você usaria cada uma?
🔴 Desafio
- Relógio com Alarme:
- Crie um componente que exiba o horário atual (HH:MM:SS) e atualize a cada segundo.
- Use
onMountpara iniciar o cronômetro. - Adicione uma variável
alarme(string no formato HH:MM). - Use um bloco reativo
$: { ... }para verificar se o horário atual é igual ao alarme. Se for, mostre um alerta na tela. - Garanta que o intervalo seja limpo no
onDestroy. - Como você otimizaria esse componente para que ele não consumisse processamento desnecessário se o usuário mudar de aba? (Pesquise sobre
visibilitychange).
Exercícios 14 - Boas Práticas e Arquitetura Frontend 🏛️
🟢 Básicos
- Pastas: Qual a utilidade da pasta
liboucomponentsem um projeto Svelte profissional? - Nomenclatura: Qual o padrão de escrita (naming convention) recomendado para nomes de arquivos de componentes?
🟡 Intermediários
- SOC: Explique o princípio de Separação de Interesses (SoC) aplicado a um componente
.svelte. - REUSABILIDADE: Cite 3 elementos de uma aplicação que você transformaria em componentes reutilizáveis para seguir o princípio DRY.
🔴 Desafio
- Refatoração de Arquitetura:
Imagine que você tem um arquivo
App.sveltecom 500 linhas de código, contendo: lógica de autenticação, o menu lateral, o rodapé e a lista de produtos.- Como você dividiria esse arquivo em pelo menos 4 novos arquivos?
- Onde você colocaria a lógica de autenticação para que ela pudesse ser acessada por qualquer componente (em uma pasta
utils,storesoulib)? - Escreva como ficaria a nova estrutura de pastas do seu projeto após essa refatoração.
Exercícios 15 - Build, Deploy e Produção 🚀
🟢 Básicos
- Build: Qual o comando usado para gerar a versão final do seu site para o usuário?
- Variáveis .env: Qual o prefixo obrigatório para variáveis de ambiente que devem ser lidas pelo Svelte via Vite?
🟡 Intermediários
- Minificação: Explique por que o arquivo CSS ou JS final gerado pelo
buildparece estar "embaralhado" ou sem espaços. - Hospedagem: Qual a diferença entre hospedar um site no GitHub Pages (estático) e em uma plataforma como Vercel ou Netlify (com integração com repositório)?
🔴 Desafio
- Preparação para Produção:
- Imagine que seu app consome uma API de desenvolvimento (
localhost:3000) e uma de produção (api.meusite.com). - Como você configuraria seus arquivos
.envpara que o código troque automaticamente a URL da API ao fazer o build? - Por que é uma falha de segurança gravíssima enviar o arquivo
.envpara o repositório público do GitHub? - Pesquise e explique o que são "Environment Variables" nas configurações de um painel como a Vercel.
- Imagine que seu app consome uma API de desenvolvimento (
Exercícios 16 - Projeto Final 🏆
🟢 Básicos
- Recapitulação: Cite os 3 conceitos do Svelte que você considerou mais impactantes durante o curso.
- Próximos Passos: O que é o SvelteKit e por que ele seria seu próximo passo de estudo?
🟡 Intermediários
- Análise de Requisitos: Pegue a proposta do seu Projeto Final. Liste quais serão os 3 principais componentes que você precisará criar para ele.
- Estado Global: Qual dado do seu projeto final será guardado em uma Svelte Store? Por que ele não pode ser apenas uma variável local?
🔴 Desafio
- Plano de Execução:
Elabore um cronograma (roadmap) de como você vai construir seu projeto final:
- Fase 1: Estrutura de pastas e navegação básica (Aulas 02, 09, 14).
- Fase 2: Criação dos componentes visuais e estilização (Aulas 03, 05, 08).
- Fase 3: Lógica de dados, Stores e integração com API (Aulas 04, 10, 11, 12).
- Fase 4: Polimento, tratamento de erros e Deploy (Aulas 13, 15).
- Quais ferramentas externas (bibliotecas de ícones, frameworks CSS, APIs de teste) você planeja utilizar?
Projetos
Projetos Práticos 🚀
Desenvolva aplicações reais para consolidar seu aprendizado.
-
Módulo 1 ---
-
Módulo 2 ---
-
Módulo 3 ---
-
Módulo 4 ---
Projeto 01 - Setup e Inspeção Moderno 🌐
Objetivo: Preparar o terreno para o desenvolvimento frontend e entender como os sites que visitamos são construídos "por baixo do capô".
🚀 Desafio
- Instalação do Node.js: Instale a versão LTS do Node.js em sua máquina.
- Verificação no Terminal:
- Abra o terminal (cmd, powershell ou bash).
- Digite
node -venpm -vpara garantir que ambos estão instalados.
- Inspeção de Site (DévTools):
- Acesse um site de sua preferência (ex: YouTube, GitHub ou o site do curso).
- Clique com o botão direito e selecione "Inspecionar".
- Vá na aba Network (Rede) e atualize a página.
- Tente identificar se o site é uma SPA (ele carrega dados sem recarregar a página ao clicar em menus?) ou uma MPA (ele pisca a cada clique?).
- Editor de Código: Instale o VS Code e as extensões "Svelte for VS Code" e "Prettier".
📤 O que entregar?
- Print (screenshot) do terminal mostrando as versões do Node e NPM.
- Um texto curto (3 linhas) descrevendo se o site que você inspecionou parece ser uma SPA ou MPA e o porquê.
- Print do VS Code com as extensões instaladas.
Projeto 02 - Meu Primeiro App (Counter 2.0) 🏗️
Objetivo: Criar e rodar seu primeiro projeto Svelte usando o Vite e entender a estrutura de pastas.
🚀 Desafio
- Criação: Execute o comando
npm create vite@latest meu-primeiro-app -- --template svelte. - Instalação: Entre na pasta e execute
npm install. - Execução: Rode o projeto com
npm run dev. - Modificação:
- Abra o arquivo
App.svelte. - Altere o contador para que ele aumente de 2 em 2 em vez de 1 em 1.
- Adicione um novo botão "Zerar" que resete o contador para 0.
- Mude a cor do texto do contador para uma cor de sua escolha no
<style>.
- Abra o arquivo
📤 O que entregar?
- Screenshot do seu navegador rodando o projeto com o botão "Zerar" visível.
- O trecho de código (script e markup) que você alterou para o contador funcionar de 2 em 2.
Projeto 03 - Cartão de Visitas Digital 🧱
Objetivo: Praticar a sintaxe básica do Svelte, interpolação de variáveis e estilização de componentes.
🚀 Desafio
Crie uma página de "Cartão de Visitas" que contenha:
1. Estrutura: Use um arquivo .svelte único para o projeto.
2. JavaScript:
- Variáveis para nome, bio, urlFoto e um array de linksRedesSociais.
3. Markup (HTML):
- Exiba a imagem (usando src={urlFoto}).
- Exiba o nome dentro de uma tag <h1>.
- Exiba a biografia em um parágrafo.
4. Estilo (CSS):
- Centralize o cartão na tela.
- Adicione uma sombra (box-shadow) e uma borda arredondada.
- Estilize os links para parecerem botões.
📤 O que entregar?
- O arquivo
App.sveltecompleto ou o link do repositório no GitHub. - Uma screenshot do cartão finalizado no navegador.
Projeto 04 - Calculadora de IMC Reativa ⚡
Objetivo: Aplicar os conceitos de reatividade automática e declarações reativas ($:) em um cenário real.
🚀 Desafio
Crie uma Calculadora de Índice de Massa Corporal (IMC):
1. Entradas: Crie dois sliders (input type="range") ou campos numéricos para Peso e Altura.
2. Cálculo Reativo:
- Use a sintaxe $: para criar uma variável imc que calcula o valor automaticamente: peso / (altura * altura).
3. Classificação Reativa:
- Use outro bloco $: para definir uma variável resultadoTexto (ex: "Abaixo do peso", "Peso Normal", "Sobrepeso").
4. Interface:
- Exiba os valores de peso e altura enquanto o usuário move os sliders.
- Exiba o valor do IMC com apenas duas casas decimais (.toFixed(2)).
- Mude a cor do texto do resultado dependendo da gravidade (ex: Vermelho para obesidade).
📤 O que entregar?
- Arquivo
App.svelte. - Screenshot da calculadora funcionando com um valor de IMC calculado.
Projeto 05 - Dashboard de Perfil 🧩
Objetivo: Praticar a criação de componentes independentes e a passagem de dados entre eles usando Props.
🚀 Desafio
Crie um dashboard de perfil que utilize pelo menos 3 componentes diferentes:
1. Componente Avatar.svelte: Recebe uma prop urlImagem e exibe a imagem circular.
2. Componente InfoUsuario.svelte: Recebe nome, cargo e localizacao e exibe esses dados estilizados.
3. Componente RedesSociais.svelte: Recebe um array de strings com links e os lista como ícones ou botões.
4. Main (App.svelte): Importe os 3 componentes e monte o layout do dashboard.
📤 O que entregar?
- A pasta
src/libcontendo os componentes criados. - Arquivo
App.svelte. - Screenshot do dashboard finalizado.
Projeto 06 - Lista de Tarefas (To-Do List) 🔁
Objetivo: Dominar o controle de fluxo ({#if}, {#each}) para gerenciar listas dinâmicas de dados.
🚀 Desafio
Crie uma aplicação de Lista de Tarefas (To-Do List) funcional:
1. Estado: Crie um array de objetos tarefas (ex: [{id: 1, texto: 'Estudar', concluida: false}]).
2. Listagem: Use o {#each} para renderizar cada tarefa.
3. Lógica:
- Se a tarefa estiver concluída, exiba-a com um risco (text-decoration: line-through).
- Adicione um botão para "Remover" a tarefa da lista.
- Adicione um botão para "Alternar" o status entre concluída/pendente.
4. Feedback: Se a lista estiver vazia, exiba uma mensagem amigável: "Uhul! Nenhuma tarefa pendente.".
📤 O que entregar?
- Arquivo
App.sveltecom a lógica e o markup. - Screenshot demonstrando a lista com pelo menos uma tarefa concluída e a mensagem de "Lista Vazia" (ao remover tudo).
Projeto 07 - Simulador de Financiamento ⌨️
Objetivo: Aplicar o Two-way Binding (bind:value) para criar um formulário interativo de simulação financeira.
🚀 Desafio
Crie um simulador de financiamento de veículo:
1. Inputs:
- Nome do cliente (texto).
- Valor do veículo (número).
- Valor da entrada (número).
- Número de parcelas (select: 12x, 24x, 36x, 48x).
2. Lógica:
- Use o bind:value em todos os campos.
- Calcule o valor da parcela mensal (considere uma taxa de juros fixa de 2% ao mês sobre o saldo devedor).
3. Validação:
- O botão "Simular" só deve aparecer se o valor da entrada for menor que o valor do veículo.
- Se a entrada for zero, exiba um aviso: "Atenção: Financiamentos sem entrada possuem juros maiores.".
📤 O que entregar?
- Arquivo
App.svelte. - Screenshot com os dados preenchidos e o valor da parcela calculado na tela.
Projeto 08 - Mini Design System 🎨
Objetivo: Praticar a estilização de componentes, o isolamento de CSS e o uso de classes condicionais.
🚀 Desafio
Crie um "Mini Design System" composto por botões e alertas reutilizáveis:
1. Botão Estilizado:
- Crie um componente Button.svelte que receba uma prop tipo (primario, secundario, perigo).
- Use class:nomeClasse={condicao} para mudar a cor do botão baseado no tipo.
2. Alerta Dinâmico:
- Crie um componente Alerta.svelte que tenha um <slot> para a mensagem.
- Adicione uma animação de "fade-in" quando o alerta aparecer.
3. Página de Demonstração:
- No App.svelte, coloque várias instâncias dos botões e alertas para demonstrar as variações de cores e estilos.
📤 O que entregar?
- Pasta
src/libcom os componentes de estilo. - Screenshot da página de demonstração mostrando as cores diferentes dos botões.
Projeto 09 - SPA de Catálogo de Filmes 🗺️
Objetivo: Implementar o roteamento em uma aplicação Svelte para simular a navegação entre múltiplas páginas.
🚀 Desafio
Crie um catálogo de filmes com 3 páginas:
1. Home (/): Exibe uma mensagem de boas-vindas e os filmes em destaque.
2. Sobre (/sobre): Explica o propósito do site.
3. Detalhes (/filme/:id): Exibe o ID do filme selecionado na URL.
4. Menu de Navegação: Deve estar visível em todas as páginas e usar use:link do svelte-spa-router.
📤 O que entregar?
- Arquivo
App.sveltecom a configuração das rotas. - Screenshot da página de "Detalhes" mostrando um ID numérico na URL e no texto da página.
Projeto 10 - Sistema de Idiomas Global 📦
Objetivo: Usar Svelte Stores para gerenciar uma configuração que precisa estar acessível em todos os componentes (Internacionalização básica).
🚀 Desafio
Crie um seletor de idiomas que mude os textos do site globalmente:
1. Store: Crie uma store idioma (iniciando como 'pt').
2. Componente Seletor.svelte: Um conjunto de botões que altera o valor da store.
3. Componentes Variados:
- No Header, exiba "Bem-vindo" ou "Welcome".
- No Footer, exiba "Contato" ou "Contact".
4. Auto-subscription: Use o prefixo $ para acessar o valor da store de forma simplificada.
📤 O que entregar?
- Arquivo
src/stores/idiomaStore.js. - Screenshot do site em Português e outro em Inglês (após clicar no botão).
Projeto 11 - Buscador de Repositórios GitHub 🌐
Objetivo: Integrar o frontend com a API real do GitHub, tratando estados de carregamento com o bloco {#await}.
🚀 Desafio
Crie um buscador de repositórios públicos:
1. Input: O usuário digita o nome de um usuário do GitHub.
2. Chamada de API: Busque os repositórios usando a URL: https://api.github.com/users/[USUARIO]/repos.
3. Interface:
- Use {#await} para mostrar um ícone de carregamento ou o texto "Buscando...".
- No bloco {:then}, liste o nome de cada repositório e a quantidade de estrelas (stargazers_count).
- No bloco {:catch}, mostre a mensagem: "Usuário não encontrado ou erro de conexão".
📤 O que entregar?
- Arquivo
App.sveltecontendo a função de fetch e o bloco await. - Screenshot da lista de repositórios carregada na tela.
Projeto 12 - Sistema de Gestão de Contatos 🏗️
Objetivo: Construir uma aplicação CRUD completa que interaja com uma API para persistir dados.
🚀 Desafio
Crie um gerenciador de contatos (Agenda):
1. Listagem (Read): Busque os contatos de uma API (ex: JSONPlaceholder).
2. Adicionar (Create): Um formulário que faz um POST e atualiza a lista.
3. Excluir (Delete): Um botão em cada contato que faz um DELETE e remove o item da tela.
4. Feedback: Desabilite o botão de enviar enquanto a requisição estiver em curso para evitar duplicidade.
📤 O que entregar?
- Código completo do componente principal.
- Screenshot do console do navegador (aba Network) mostrando a requisição POST sendo enviada com sucesso.
Projeto 13 - Timer com Histórico ⏳
Objetivo: Gerenciar recursos do navegador usando funções de ciclo de vida (onMount e onDestroy) para evitar vazamentos de memória.
🚀 Desafio
Crie uma ferramenta de produtividade (Pomodoro simplificado):
1. Timer: Um cronômetro regressivo que inicia em 25:00.
2. Ciclo de Vida:
- O timer deve iniciar apenas quando o componente for montado.
- O intervalo (setInterval) deve ser obrigatoriamente limpo quando o usuário mudar de rota ou fechar o componente.
3. Histórico:
- Toda vez que o timer chegar a zero, adicione o horário da conclusão em um array de "Sessões Concluídas".
- Exiba esse histórico em uma lista.
📤 O que entregar?
- Arquivo
App.sveltecontendo as funçõesonMounteonDestroy. - Screenshot do timer rodando e da lista de sessões concluídas.
Projeto 14 - Reorganizando o Dashboard 🏛️
Objetivo: Aplicar padrões de arquitetura e organização de arquivos para tornar um projeto desorganizado em algo profissional.
🚀 Desafio
Refatore seu projeto da Aula 05 (Dashboard de Perfil) seguindo as boas práticas:
1. Estrutura:
- Mova todos os componentes visuais para src/lib/components.
- Mova a lógica de dados (como arrays de ícones ou formatadores) para src/utils.
2. Padronização:
- Renomeie os arquivos para seguir o padrão PascalCase.svelte (ex: UserCard.svelte).
3. Componente Base:
- No App.svelte, mantenha apenas a importação dos componentes e a montagem do layout.
- Use um <Layout> decorativo se possível para envolver a aplicação.
📤 O que entregar?
- Print da estrutura de pastas do VS Code aberta (
srcexpandida). - O arquivo
App.svelterefatorado e limpo.
Projeto 15 - Portfólio no Ar 🚀
Objetivo: Publicar um projeto real na internet, configurando variáveis de ambiente e o processo de build.
🚀 Desafio
Escolha seu melhor mini-projeto feito até aqui e coloque-o em produção:
1. GitHub: Suba o código para um novo repositório público.
2. Variáveis: Se seu projeto usa alguma API, crie um arquivo .env (ex: VITE_API_URL=...) e certifique-se de que ele está no .gitignore.
3. Deploy:
- Conecte o repositório na Vercel ou Netlify.
- Configure as "Environment Variables" no painel da plataforma.
4. Build: Verifique se o build foi concluído com sucesso e se o site está acessível via URL pública.
📤 O que entregar?
- Link do seu projeto rodando (URL da Vercel/Netlify).
- Link do repositório no GitHub.
Projeto 16 - Consolidação Final 🚩
Objetivo: Realizar a entrega final do projeto escolhido na Aula 16, aplicando todos os requisitos técnicos exigidos.
🚀 Desafio
Este é o momento de finalizar sua aplicação escolhida (Task Manager, Dashboard ou E-commerce):
1. Revisão Final: Verifique se todos os requisitos (Componentes, Reatividade, Store, API, Roteamento e Estilo) foram atendidos.
2. Polimento: Adicione feedback de carregamento (loading) e tratamento de erros amigáveis.
3. Documentação: Escreva um arquivo README.md no seu repositório explicando:
- O que o projeto faz.
- Como rodar localmente (npm install -> npm run dev).
- Quais tecnologias foram usadas.
📤 O que entregar?
- Link do repositório final no GitHub.
- Vídeo curto (screencast de até 1 minuto) ou GIF demonstrando as principais funcionalidades da aplicação funcionando.
- Screenshot da estrutura final de componentes e stores.
Quizzes
Quizzes de Conhecimento 🧠
Teste seus conhecimentos após cada aula.
-
Módulo 1 ---
-
Módulo 2 ---
-
Módulo 3 ---
-
Módulo 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 das Aulas 📽️
Acompanhe o conteúdo visual das 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
Configuração do Ambiente 🛠️
Siga os guias abaixo para preparar seu computador para o desenvolvimento Svelte moderno.
-
Módulo 1: Core Runtime --- Instalação do Node.js, NPM e gerenciadores de pacotes.
-
Módulo 2: Editor e Ferramentas --- Configuração do VS Code, extensões e formatação de código.
-
Módulo 3: Workflow de Build --- Uso do Vite, criação de projetos e versionamento com Git.
-
Módulo 4: Qualidade e Debug --- Svelte DevTools e técnicas de inspeção no navegador.
[!TIP] Dica: Comece sempre pelo Setup 01. Sem o Node.js, as outras ferramentas não funcionarão corretamente.
Setup 01: Node.js e Gerenciadores de Pacotes 🟢
O Svelte requer o ambiente Node.js para rodar o compilador e as ferramentas de build (Vite).
1. Instalando o Node.js
- Acesse o site oficial: nodejs.org.
- Baixe a versão LTS (Long Term Support) - é a mais estável.
- Siga o instalador padrão do seu Sistema Operacional.
2. Verificando a Instalação
Abra o seu terminal (CMD, PowerShell ou Terminal do Linux/Mac) e digite:
Você deverá ver as versões instaladas (ex: v20.x.x).3. Gerenciadores Alternativos (Opcional)
Embora o npm venha instalado, muitos desenvolvedores preferem o PNPM por ser mais rápido e economizar espaço em disco.
4. NVM (Dica de Pro) 💡
Se você trabalha em vários projetos, instale o NVM (Node Version Manager). Ele permite trocar de versão do Node com um comando. - Windows: nvm-windows. - Linux/Mac: nvm.
Próximo Passo: Instalar o VS Code e Extensões 💻
Setup 02: VS Code e Extensões 💻
O Visual Studio Code é a ferramenta recomendada para desenvolver com Svelte devido ao excelente suporte da comunidade.
1. Instalando o VS Code
- Baixe em: code.visualstudio.com.
- Instale seguindo as recomendações padrões.
2. Extensões Essenciais para Svelte 🧩
Abra o menu de extensões (Ctrl+Shift+X) e instale:
- Svelte for VS Code: Oferece realce de sintaxe e autocompletar. (Obrigatória!)
- Prettier - Code formatter: Para organizar seu código automaticamente.
- Tailwind CSS IntelliSense: Se você for usar Tailwind.
- Error Lens: Ajuda a ver erros direto na linha de código.
3. Configurando o Formatter
Para que o Prettier formate seus arquivos .svelte corretamente:
1. Abra as configurações (Ctrl+,).
2. Pesquise por Default Formatter.
3. Selecione Prettier - Code Formatter.
4. Ative a opção Format on Save.
4. Temas Recomendados (Opcional)
- One Dark Pro
- Dracula Official
- Catppuccin
Próximo Passo: Vite e Estrutura de Projeto 🚀
Setup 03: Vite e Estrutura de Projeto ⚡
O Svelte moderno utiliza o Vite para um desenvolvimento extremamente rápido.
1. Criando um Novo Projeto
No terminal, na pasta onde deseja salvar seus estudos, execute:
1. Entre na pasta:cd meu-projeto-svelte.
2. Instale as dependências: npm install.
3. Rode o projeto: npm run dev.
2. Entendendo a Estrutura 📂
node_modules/: Onde ficam as bibliotecas instaladas.public/: Arquivos estáticos (imagens, ícones).src/: Onde você passará 99% do seu tempo.App.svelte: O componente principal.main.js: O ponto de entrada que inicia o Svelte.
package.json: A lista de dependências e scripts do projeto.
3. Versionamento com Git
Sempre inicie um repositório Git para seus projetos:
4. SvelteKit vs Svelte puro
Neste curso, focamos no Svelte puro com Vite para aprender a base. Projetos maiores e complexos (com rotas no servidor) usam o SvelteKit.
Próximo Passo: DevTools e Debugging 🔍
Setup 04: Svelte DevTools e Debugging 🔍
Para debugar aplicações Svelte de forma eficiente, as ferramentas nativas do navegador são ótimas, mas a extensão oficial do Svelte é ainda melhor.
1. Svelte DevTools
Esta extensão adiciona uma aba "Svelte" ao seu console do desenvolvedor (F12), permitindo inspecionar o estado e as props de cada componente em tempo real.
- Chrome: Link Chrome Web Store.
- Firefox: Link Firefox Add-ons.
2. Inspecionando Elementos
Com o DevTools instalado:
1. Abra seu projeto rodando em localhost:5173.
2. Abra o console (F12).
3. Vá na aba Svelte.
4. Selecione um componente na árvore para ver suas variáveis atuais.
3. O comando console.log() 📢
No Svelte, você pode usar o log dentro das tags reativas para rastrear mudanças:
4. Error Lens no VS Code
Se você seguiu o Setup 02, o Error Lens mostrará erros de sintaxe instantaneamente na tela, sem que você precise rodar o código para descobrir o erro.
Finalizado! Agora seu ambiente está pronto para brilhar com Svelte. ✨
Sobre
Sobre o Curso
🎓 Desenvolvimento Frontend com Svelte
Este curso foi projetado para capacitar desenvolvedores na criação de interfaces web modernas, rápidas e eficientes utilizando o Svelte, um dos frameworks mais inovadores do ecossistema JavaScript.
🎯 Objetivos do Curso
-
Reatividade Nativa --- Compreender como o Svelte move o trabalho para o tempo de compilação, eliminando o Virtual DOM.
-
Componentização --- Dominar a criação de componentes reutilizáveis, encapsulamento de estilos e comunicação entre elementos.
-
Gerenciamento de Estado --- Aprender a utilizar Svelte Stores para gerenciar dados globais de forma simples e poderosa.
-
Integração com APIs --- Conectar o frontend a serviços externos, realizando operações CRUD e tratando estados de carregamento.
📚 O Que Você Vai Aprender
Módulo 1 – Fundamentos e Reatividade
- Evolução do Frontend e SPA
- O compilador Svelte vs Virtual DOM
- Sintaxe Básica e Interpolação
- Declarações Reativas ($:)
Módulo 2 – Componentização e UI
- Props e Slot System
- Loops (#each) e Condicionais (#if)
- Eventos e Two-way Binding
- Estilização Local e Global
Módulo 3 – Ecossistema e Estado
- Roteamento SPA
- Writable e Derived Stores
- Consumo de Fetch API e Async/Await
- Implementação de CRUD Completo
Módulo 4 – Avançado e Produção
- Ciclo de Vida (onMount, onDestroy)
- Performance e Lazy Loading
- Arquitetura de Projetos Frontend
- Build, Deploy e Variáveis de Ambiente
🛠️ Metodologia
Foco 100% prático. Cada aula introduz um conceito que é imediatamente aplicado em um mini-projeto. Ao final, você terá desenvolvido uma aplicação administrativa completa, pronta para o mercado.
Pronto para dominar o Svelte? Começar Agora
Roadmap do Projeto: Frontend com Svelte 🚀
Este documento rastreia a evolução do curso.
✅ Fase 1: Planejamento (Concluído)
- [x] Definição Syllabus (16 Aulas)
- [x] Escolha do Stack (Svelte + Vite)
- [x] Configuração MkDocs Material com Paleta Teal/Amber
✅ Fase 2: Conteúdo Base (Em Progresso)
- [/] Criação das 16 Aulas (Markdown + Mermaid)
- [/] Criação dos 16 Quizzes (Interativos)
- [/] Criação dos 16 Conjuntos de Exercícios (2B, 2I, 1D)
- [/] Criação dos 16 Slides (RevealJS)
✅ Fase 3: Projetos e UX
- [ ] Definição dos 16 Projetos evolutivos
- [ ] Implementação de exemplos TermynalJS
- [ ] Diagramação Mermaid corrigida
🚀 Fase 4: Lançamento e Manutenção
- [ ] Build Final --strict
- [ ] Deploy GitHub Pages (gh-pages)
- [ ] Testes de UX e Acessibilidade
Status Atual: Refatoração em Progresso Última Atualização: 22/02/2026
Materiais Complementares 📚
Bem-vindo à seção de materiais complementares do curso de Desenvolvimento Frontend com Svelte. 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.
-
- Pratique os conceitos de reatividade e componentes.
-
- Valide seu aprendizado com testes rápidos por módulo.
-
- Construa um ecossistema completo para seu portfólio.
-
- Guias de instalação (Docker, IDEs, Postman).
Versão para Impressão
Esta página foi gerada automaticamente para impressão.