Table of Contents
Desenvolvimento Frontend com Angular 💻
Domine a criação de aplicações web modernas com Angular, explorando desde a arquitetura clássica com NgModules até as inovações modernas com Standalone Components, RxJS e APIs REST.
Foco do Curso
Metodologia: Aprendizado prático focado na construção de Single Page Applications (SPA) de alta performance, seguindo as melhores práticas do mercado e do Google.
🎯 O Que Você Vai Aprender
-
Fundamentos e CLI --- Conheça o ecossistema Angular, instale o CLI e crie sua primeira aplicação SPA com a estrutura profissional. Ir para Módulo 1
-
Data Binding e Diretivas --- Domine a manipulação dinâmica de dados com Interpolação, Event Binding e Diretivas Estruturais como
*ngIfe*ngFor. Ver Data Binding -
Standalone Components --- Aprenda a nova forma de desenvolver com Angular 15+, eliminando a complexidade dos NgModules e otimizando o build. Ver Angular Moderno
-
RxJS e HTTP Client --- Consuma APIs de forma reativa, utilizando Observables, Pipes e o poderoso HttpClient para integrações robustas. Ver Reatividade
📚 Jornada de Aprendizado (16 Aulas)
O curso é estruturado para levar você do zero ao deploy profissional.
🧱 Módulo 1: Fundamentos e Estrutura (Aulas 01-04)
- Aula 01 - Intro e Ecossistema 🧩
- Aula 02 - Estrutura e Componentes 🏗️
- Aula 03 - Data Binding 📡
- Aula 04 - Diretivas 📄
⚙️ Módulo 2: Core e Comunicação (Aulas 05-07)
- Aula 05 - Comunicação entre Componentes 🔄
- Aula 06 - Serviços e Injeção de Dependência 💾
- Aula 07 - Roteamento (Approach Clássico) 🛣️
🚀 Módulo 3: Angular Moderno (Aulas 08-11)
- Aula 08 - Standalone Components 📦
- Aula 09 - Roteamento Standalone 🗺️
- Aula 10 - Forms (Reactive & Template) 📝
- Aula 11 - HTTP Client e API 🔌
🏆 Módulo 4: Profissional e Deploy (Aulas 12-16)
- Aula 12 - RxJS e Programação Reativa 🧠
- Aula 13 - Arquitetura Profissional 🏛️
- Aula 14 - Estilização e Material 🎨
- Aula 15 - Build e Deploy 🚢
- Aula 16 - Projeto Final Integrador 🎓
Plano de Ensino 📅
Curso: Desenvolvimento Frontend com Angular
Ementa
- Fase 1: Abordagem Clássica (NgModule): Arquitetura, Componentes, Data Binding, Diretivas e Serviços.
- Fase 2: Angular Moderno (Standalone): Standalone Components, Forms, API consumption, RxJS e Arquitetura Avançada.
Cronograma (16 Aulas)
Módulo 1: Fundamentos e Estrutura
- Aula 01: Introdução ao Angular e Ecossistema (SPA, CLI, Node.js)
- Aula 02: Estrutura do Projeto e Componentes (Visão Clássica)
- Aula 03: Data Binding (Interpolação, Property, Event, Two-way)
- Aula 04: Diretivas Estruturais (ngIf, ngFor) e de Atributo
Módulo 2: Core e Comunicação
- Aula 05: Comunicação entre Componentes (@Input, @Output, EventEmitter)
- Aula 06: Serviços e Injeção de Dependência (ProvidedIn: 'root')
- Aula 07: Roteamento no Modelo Clássico (RouterModule)
Módulo 3: Angular Standalone e Formulários
- Aula 08: Standalone Components (O novo padrão do Angular 15+)
- Aula 09: Roteamento Standalone (provideRouter, loadComponent)
- Aula 10: Formulários (Reactive Forms e Template-driven)
- Aula 11: HTTP Client e Integração com APIs REST
Módulo 4: Avançado, RxJS e Deploy
- Aula 12: RxJS e Programação Reativa (Observables, Subjects)
- Aula 13: Arquitetura e Organização Profissional (Core/Shared/Features)
- Aula 14: Estilização Moderna e Angular Material
- Aula 15: Build de Produção, Deploy e Performance
- Aula 16: Projeto Final Integrador (CRUD Completo)
Avaliação
- Exercícios: 16 listas focadas em lógica e implementação Angular.
- Projetos: 16 etapas de construção de um sistema real.
- Quizzes: 16 avaliações de conceitos-chave.
- Projeto Final: Uma aplicação SPA completa publicada em produção.
Aulas
Aula 01: Introdução ao Angular e Ecossistema 🅰️
Nesta aula, vamos mergulhar no universo do Angular, entender o conceito de Single Page Applications (SPA) e preparar nosso ambiente para criar a primeira aplicação profissional.
🌐 O que é SPA (Single Page Application)?
Uma SPA é uma aplicação web que carrega apenas uma única página HTML e atualiza dinamicamente o conteúdo à medida que o usuário interage. Diferente dos sites tradicionais, não há recarregamento total da página (refresh).
Conceito Chave
Em uma SPA, a navegação entre visualizações ocorre no lado do cliente (browser), o que proporciona uma experiência de usuário muito mais fluida e rápida, similar a um aplicativo mobile.
🏛️ Arquitetura do Angular
O Angular segue uma arquitetura baseada em Componentes, onde cada parte da interface é uma peça independente.
graph TD
A[Aplicação Angular] --> B[Componente Raiz]
B --> C[Home Component]
B --> D[Navbar Component]
B --> E[Footer Component]
C --> F[Card Component]
C --> G[List Component]
🛠️ Preparando o Ambiente
Para começar, precisamos instalar o Node.js e o Angular CLI.
1. Instalação com Termynal
🚀 Prática: Primeiro Projeto
Vamos criar e rodar nosso primeiro projeto Angular utilizando o terminal.
Dica de Produtividade
Use o comando ng new seguido pelo nome do projeto. O Angular CLI cuidará de toda a estrutura inicial para você.
📑 Estrutura do Projeto
Ao abrir o projeto no VS Code, você verá uma estrutura organizada:
src/: Onde fica o código fonte da aplicação.app/: Contém os componentes e lógica principal.assets/: Imagens e arquivos estáticos.angular.json: Configurações globais do CLI.
Atenção
Não altere arquivos na pasta node_modules manualmente. Todas as dependências devem ser gerenciadas via package.json.
🏁 Mini-Projeto da Aula
Crie uma nova aplicação Angular chamada projeto-aula-01, execute-a no seu navegador e altere o texto "Hello" no arquivo app.component.html.
Aula 02: Estrutura do Projeto e Componentes (Abordagem Clássica) 🏗️
Nesta aula, vamos dissecar a anatomia de um projeto Angular e entender o coração do framework: os Componentes.
📁 Estrutura de Pastas Profissional
Um projeto Angular possui diversos arquivos de configuração. Vamos entender os principais:
main.ts: O ponto de entrada da aplicação. É aqui que o Angular inicia o módulo raiz.index.html: A única página física da SPA. Contém a tag<app-root>.angular.json: Configurações do CLI (scripts, estilos globais, caminhos).
🧩 O que é um Componente?
Um componente no Angular é composto por 4 elementos principais:
- Classe (
.ts): Lógica e dados. - Template (
.html): Estrutura visual. - Estilo (
.cssou.scss): Design isolado. - Teste (
.spec.ts): Validação automatizada.
graph LR
A[Componente] --> B[HTML/Template]
A --> C[CSS/Estilos]
A --> D[TS/Lógica]
A --> E[Metadados/@Component]
🛠️ Criando Componentes com o CLI
Não criamos arquivos manualmente! Usamos o comando generate (ou o atalho g).
Comportamento do CLI
Ao gerar um componente, o CLI cria os 4 arquivos, cria uma pasta própria e, na abordagem clássica, o registra automaticamente no app.module.ts.
📦 Introdução ao NgModule
Na abordagem clássica, o Module é o arquivo que agrupa componentes, serviços e outras dependências.
Atenção
Para que um componente possa ser usado no HTML de outro, ele deve estar declarado em um NgModule.
🚀 Prática: Layout com Componentes
Vamos criar uma estrutura de layout simples com múltiplos componentes.
No arquivo app.component.html, chame os seletores:
🏁 Mini-Projeto da Aula
Crie três componentes (Navbar, Sidebar e MainContent). Organize-os no app.component.html para formar o layout de um dashboard simples. Customize as cores de cada um usando arquivos CSS isolados.
Macro Syntax Error
File: aulas/aula-03.md
Line 17 in Markdown file: Expected an expression, got 'end of print statement'
Aula 04: Diretivas Estruturais e de Atributo 🛠️
Nesta aula, vamos aprender como manipular a estrutura do nosso HTML e o comportamento dos elementos usando as Diretivas do Angular.
🧩 O que são Diretivas?
Diretivas são instruções que o Angular usa para transformar o DOM. Elas se dividem em dois grandes grupos:
- Estruturais: Alteram a estrutura do HTML (adicionam ou removem elementos). Usam o prefixo
*. - De Atributo: Alteram a aparência ou o comportamento de um elemento existente.
🏗️ Diretivas Estruturais
As mais famosas são o *ngIf e o *ngFor.
1. *ngIf
Renderiza um elemento apenas se uma condição for verdadeira.
2. *ngFor
Cria um loop para repetir um elemento para cada item de uma lista.
🎨 Diretivas de Atributo
Alteram como o elemento se parece.
1. ngClass
Adiciona ou remove classes CSS dinamicamente.
2. ngStyle
Aplica estilos CSS inline dinamicamente.
🌟 Diagrama de Funcionamento
graph LR
A[Componente] --> B{Diretiva}
B -- Estrutural --> C[Muda o DOM: Adiciona/Remove]
B -- Atributo --> D[Muda o Elemento: Cor/Classe]
🛠️ Criando uma Diretiva Personalizada (Intro)
Você também pode criar suas próprias diretivas para reutilizar comportamentos.
🚀 Prática: Listagem Dinâmica
Vamos criar uma lista de "Tarefas" onde podemos marcar como concluídas.
- Use
*ngForpara listar as tarefas. - Use
*ngIfpara mostrar um aviso se a lista estiver vazia. - Use
ngClasspara riscar o texto da tarefa quando ela estiver concluída.
🏁 Mini-Projeto da Aula
Crie uma galeria de produtos. Cada produto deve ser um objeto com nome, preço e disponibilidade. Use *ngFor para exibir os produtos, *ngIf para mostrar o selo "Esgotado" e ngStyle para mudar a cor do preço (vermelho para produtos caros, verde para baratos).
Aula 05: Comunicação entre Componentes 🔄
Nesta aula, vamos aprender como os componentes "conversam" entre si em uma arquitetura hierárquica usando @Input e @Output.
📢 Fluxo de Dados Hierárquico
No Angular, os dados geralmente fluem do pai para o filho e os eventos do filho para o pai.
graph TD
P[Componente Pai] -- "@Input" --> F[Componente Filho]
F -- "@Output (EventEmitter)" --> P
📥 Recebendo Dados: @Input()
O decorator @Input() permite que o componente filho receba valores vindo de seu pai.
No Componente Filho (.ts):
No Componente Pai (.html):
📤 Enviando Eventos: @Output()
O decorator @Output() combinado com EventEmitter permite que o filho envie notificações ou dados de volta para o pai.
No Componente Filho (.ts):
No Componente Pai (.html):
🧠 Smart vs Dumb Components
- Smart Components (Pai): Gerenciam dados, fazem chamadas de API e cuidam da lógica de negócio.
- Dumb Components (Filho): Apenas exibem dados recebidos via
@Inpute notificam o pai via@Output. São altamente reutilizáveis.
🚀 Prática: Lista de Contatos
Vamos construir um sistema onde: 1. O Pai gerencia uma lista de contatos. 2. O Filho exibe o detalhe de um único contato (@Input). 3. O Filho tem um botão "Excluir" que notifica o pai para remover aquele contato da lista (@Output).
🏁 Mini-Projeto da Aula
Crie um componente Contador. O componente pai deve passar o valor inicial do contador para o filho. O filho deve ter botões de "+" e "-". Toda vez que o valor mudar no filho, ele deve emitir um evento para o pai atualizar o total geral na tela dele.
Aula 06: Serviços e Injeção de Dependência 💉
Nesta aula, vamos aprender como compartilhar lógica e dados entre componentes de forma profissional e escalável usando Serviços e o sistema de Injeção de Dependência (DI) do Angular.
🏛️ Por que usar Serviços?
Componentes devem focar na interface (UI). Lógica pesada, como cálculos ou chamadas a banco de dados, deve ser isolada em um Serviço.
- Reaproveitamento: Vários componentes podem usar o mesmo serviço.
- Singleton: Por padrão, o Angular cria apenas uma instância do serviço para toda a aplicação.
- Organização: Separa a "casca" (UI) do "motor" (Lógica).
🛠️ Criando um Serviço com o CLI
Usamos o comando generate service (ou g s).
💉 Injeção de Dependência
Não instanciamos servicos com new Servico(). O Angular faz isso para nós através do Construtor.
1. Definindo o Serviço:
2. Injetando no Componente:
🌟 Diagrama de Injeção
graph TD
S[Serviço] --> |Injetado| C1[Home Component]
S --> |Injetado| C2[Navbar Component]
S --> |Injetado| C3[Dashboard Component]
C1 -.-> |Compartilha Dados| S
C3 -.-> |Compartilha Dados| S
🚀 Prática: Gerenciamento de Tarefas
Vamos refatorar nosso código de tarefas para que:
1. A lista de tarefas não fique mais no componente.
2. Crie um TarefaService com métodos adicionar() e listar().
3. Dois componentes diferentes usem o mesmo serviço para mostrar a mesma lista.
🏁 Mini-Projeto da Aula
Crie um CarrinhoService. Ele deve ter um array privado de itens. Crie métodos para adicionarItem(produto) e exibirTotal(). Use esse serviço em um componente de "Lista de Produtos" e em um componente de "Mini-Carrinho" (que fica no topo da página).
Aula 07: Roteamento (Abordagem Clássica) 🛣️
Nesta aula, vamos aprender como transformar nossa Single Page Application em um site multipágina usando o Angular Router.
📍 O que é o Roteamento?
O roteamento permite que o usuário navegue entre diferentes visualizações (URL /home, /contato) sem que o navegador faça um "refresh" total.
graph LR
URL[URL do Browser] --> R[Router]
R --> |/home| C1[HomeComponent]
R --> |/produtos| C2[ProdutosComponent]
R --> |/vazio| C3[NotFoundComponent]
🛠️ Configuração Básica (app-routing.module.ts)
Na abordagem clássica, definimos um array de rotas.
🏠 Exibindo as Rotas: router-outlet
Para indicar ao Angular onde os componentes das rotas serão renderizados, usamos a tag <router-outlet>.
🔗 Navegando: routerLink
Não usamos href para links internos! Usamos a diretiva routerLink para que o Angular controle a navegação.
🆔 Parâmetros de Rota
Podemos passar valores dinâmicos na URL (ex: /produto/123).
- Definição:
{ path: 'produto/:id', component: DetalheComponent } - Captura: Usamos o serviço
ActivatedRoutepara ler o ID.
🚀 Prática: Site Institucional
Vamos criar um site com 3 páginas: 1. Home: Boas-vindas. 2. Sobre: Descrição da empresa. 3. Contato: Um formulário de contato.
Adicione um menu de navegação que permita transitar entre elas sem recarregar o browser.
🏁 Mini-Projeto da Aula
Crie um catálogo de filmes. Teremos duas rotas: /filmes (lista todos) e /filme/:id (mostra o detalhe do filme clicado). No componente de detalhe, exiba o ID recebido da URL para confirmar que o roteamento está funcionando.
Aula 08: Standalone Components 📦
Nesta aula, entramos na era do Angular Moderno. Vamos aprender como criar componentes que não precisam mais de um NgModule para funcionar.
🆕 O que mudou no Angular 15+?
Historicamente, todo componente precisava estar declarado em um módulo. Com os Standalone Components, o componente se torna autossuficiente.
graph LR
A[Componente Clássico] --> B[NgModule]
B --> C[Aplicação]
D[Componente Standalone] --> E[Aplicação]
D -.-> |Importa diretamente| F[CommonModule/Outros]
🛠️ Anatomia de um Standalone Component
A principal diferença está no decorator @Component, onde adicionamos a propriedade standalone: true.
🚀 Iniciando a App sem Módulo
No Angular Moderno, o bootstrap da aplicação muda do módulo para o componente raiz diretamente usando bootstrapApplication.
Arquivo main.ts:
⚖️ Comparação: Clássico vs Standalone
| Característica | Clássico (NgModule) | Standalone (Moderno) |
|---|---|---|
| Declaração | Obrigatória no Module | Nenhuma (auto-gerido) |
| Imports | Feito no Module | Feito no próprio Componente |
| Complexidade | Alta (muitos arquivos) | Baixa (mais direto) |
| Performance | Padrão | Melhor (Tree-shaking) |
🛠️ Gerando no CLI
Dica
A partir de versões mais recentes, o Angular CLI pode ser configurado para que todos os componentes novos sejam standalone por padrão.
🚀 Prática: Primeiro Projeto Moderno
- Crie um novo componente usando a flag
--standalone. - Tente importar o
CommonModuledentro dele para usar o*ngIfe o*ngFor. - Note que você não precisou tocar no arquivo
app.module.ts!
🏁 Mini-Projeto da Aula
Refatore seu projeto da Aula 02 (que usava módulos) para usar apenas Standalone Components. Remova o arquivo app.module.ts e atualize o main.ts para usar o bootstrapApplication.
Aula 09: Roteamento no Modelo Standalone 🗺️
Nesta aula, vamos aprender como configurar a navegação da nossa aplicação Angular usando o modelo moderno, eliminando a dependência do AppRoutingModule.
📍 Roteamento sem Módulos
No modelo standalone, não usamos mais o RouterModule.forRoot(). Em vez disso, usamos a função provideRouter() durante o bootstrap da aplicação.
Configuração no main.ts:
📁 Organização de Rotas (app.routes.ts)
As rotas continuam sendo um array de objetos, mas agora importamos os componentes diretamente.
🚀 Lazy Loading com loadComponent
No modelo clássico, o lazy loading era feito por módulos (loadChildren). No modelo standalone, podemos carregar componentes individuais sob demanda.
🛠️ O que mudou no HTML?
Absolutamente nada! As diretivas <router-outlet> e [routerLink] continuam funcionando da mesma forma.
Atenção
Como seu componente agora é Standalone, você deve importar explicitamente o RouterModule (ou as diretivas individuais como RouterOutlet) dentro do array imports do seu componente.
🌟 Vantagens do Roteamento Standalone
- Menos arquivos: Não precisa do
app-routing.module.ts. - Performance: O Lazy Loading de componentes é mais granular que o de módulos.
- Clareza: O
main.tsmostra claramente quais serviços e configurações a app possui.
🚀 Prática: Refatoração de Rotas
Vamos pegar o projeto da Aula 07 e:
1. Remover o AppRoutingModule.
2. Mover a constante routes para um arquivo próprio.
3. Configurar o provideRouter no main.ts.
4. Transformar o lazy loading de módulos em lazy loading de componentes.
🏁 Mini-Projeto da Aula
Crie um sistema de abas (Tabs). Cada aba deve ser um componente independente. Configure o roteamento para que cada aba tenha sua própria URL e use o loadComponent para que o código de cada aba só seja baixado quando o usuário clicar nela.
Aula 10: Formulários no Angular 📝
Nesta aula, vamos aprender como coletar e validar dados dos usuários usando as duas abordagens do Angular: Template-driven e Reactive Forms.
🎭 As Duas Abordagens
| Característica | Template-driven | Reactive Forms |
|---|---|---|
| Configuração | No HTML (Directivas) | No TypeScript (Código) |
| Escalabilidade | Indicado para formulários simples | Indicado para formulários complexos |
| Validação | No HTML | Programática |
| Previsibilidade | Menor (Assíncrono) | Maior (Síncrono/Imutável) |
1. Template-driven Forms
Usa o ngModel para criar o modelo de dados automaticamente a partir do HTML.
2. Reactive Forms
Você cria e gerencia o estado do formulário explicitamente no TypeScript. Oferece muito mais controle.
No TypeScript (.ts):
No HTML (.html):
✅ Validações e feedback
O Angular permite verificar o estado de cada campo (dirty, touched, valid, invalid).
🌟 Ciclo do Formulário
graph LR
A[Usuário Digita] --> B[Estado do Control Muda]
B --> C{Válido?}
C -- Sim --> D[Botão Ativado]
C -- Não --> E[Exibe Erro]
D --> F[Submit: Dados para o Servidor]
🚀 Prática: Cadastro de Usuário
Vamos construir um formulário de cadastro com: 1. Campos: Nome, Email, Senha e Confirmação de Senha. 2. Validação de obrigatoriedade e máscara de email. 3. Desabilitar o botão de enviar até que tudo esteja correto.
🏁 Mini-Projeto da Aula
Crie um formulário de Feedback. O usuário deve avaliar o serviço de 1 a 5 (Dropdown) e escrever um comentário (Textarea). Use Reactive Forms e exiba uma mensagem de sucesso na tela após o "envio" dos dados.
Aula 11: HTTP Client e Consumo de API REST 🌐
Nesta aula, vamos aprender como conectar nossa aplicação Angular a servidores externos para buscar, criar, atualizar e deletar dados usando o HttpClient.
📡 O que é o HttpClient?
É um serviço nativo do Angular que facilita a realização de requisições HTTP (GET, POST, PUT, DELETE) para APIs REST.
- Baseado em Observables (RxJS).
- Trata automaticamente a conversão para JSON.
- Oferece interceptores para gerenciar tokens e erros.
🛠️ Configuração Standalone
No modelo standalone, habilitamos o cliente HTTP no main.ts usando o provider provideHttpClient().
💉 Usando o HttpClient no Serviço
Sempre isolamos as chamadas de API em serviços para manter o código limpo e reutilizável.
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
@Injectable({ providedIn: 'root' })
export class PostService {
private url = 'https://jsonplaceholder.typicode.com/posts';
constructor(private http: HttpClient) {}
listarPosts() {
return this.http.get<any[]>(this.url);
}
salvarPost(post: any) {
return this.http.post(this.url, post);
}
}
📥 Consumindo no Componente
Como o http.get retorna um Observable, precisamos usar o método .subscribe() para receber os dados.
🌟 Fluxo da Requisição
graph LR
A[Componente] --> B[Serviço]
B --> |http.get| C[API REST]
C --> |JSON Response| B
B --> |Observable| A
A --> |subscribe| D[Atualiza Tela]
🚀 Prática: Consumo de API Real
Vamos utilizar a API gratuita JSONPlaceholder para: 1. Listar uma série de postagens em uma lista. 2. Criar um pequeno formulário para "simular" o envio de um novo post. 3. Implementar um botão de deletar que remove o item da interface.
🏁 Mini-Projeto da Aula
Crie um buscador de CEP usando a API do ViaCEP. O usuário digita o CEP, clica no botão e o seu serviço deve retornar o endereço completo para ser exibido na tela.
Macro Rendering Error
File: aulas/aula-12.md
UndefinedError: 'item' is undefined
Traceback (most recent call last):
File "/home/runner/work/ads_spec_frontend_com_angular/ads_spec_frontend_com_angular/.venv/lib/python3.11/site-packages/mkdocs_macros/plugin.py", line 703, in render
return md_template.render(**page_variables)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/runner/work/ads_spec_frontend_com_angular/ads_spec_frontend_com_angular/.venv/lib/python3.11/site-packages/jinja2/environment.py", line 1295, in render
self.environment.handle_exception()
File "/home/runner/work/ads_spec_frontend_com_angular/ads_spec_frontend_com_angular/.venv/lib/python3.11/site-packages/jinja2/environment.py", line 942, in handle_exception
raise rewrite_traceback_stack(source=source)
File "<template>", line 55, in top-level template code
File "/home/runner/work/ads_spec_frontend_com_angular/ads_spec_frontend_com_angular/.venv/lib/python3.11/site-packages/jinja2/environment.py", line 490, in getattr
return getattr(obj, attribute)
^^^^^^^^^^^^^^^^^^^^^^^
jinja2.exceptions.UndefinedError: 'item' is undefined
Aula 13: Arquitetura e Organização Profissional 🏗️
Nesta aula, vamos aprender como estruturar projetos Angular de grande escala seguindo os padrões utilizados pelas maiores empresas de tecnologia.
📁 Padrão LIFT
O Angular recomenda o padrão LIFT: * Locate: Localizar o código rapidamente. * Identify: Identificar o que o arquivo faz pelo nome. * Flat: Manter uma estrutura o mais plana possível (sem pastas infinitas). * Try to be DRY: Evite repetições desnecessárias.
🏛️ Estrutura de Pastas Recomendada
Um projeto profissional geralmente divide as responsabilidades em três pilares:
- Core: Serviços globais, interceptores e guards (singleton).
- Shared: Componentes visuais genéricos (botões, inputs), pipes e diretivas reutilizáveis.
- Features: As funcionalidades do negócio (ex:
login,vendas,perfil).
graph TD
App[src/app] --> Core[core/]
App --> Shared[shared/]
App --> Features[features/]
Features --> Login[login/]
Features --> Products[products/]
🏷️ Convenções de Nomeclatura
O Angular CLI segue o padrão de kebab-case com sufixos descritivos:
* usuario-header.component.ts
* auth.service.ts
* valida-email.directive.ts
Dica de Ouro
Mantenha cada arquivo com uma única responsabilidade (Single Responsibility Principle). Se um componente tem 1000 linhas, ele deve ser quebrado!
📦 Barrel Files (index.ts)
Para evitar dezenas de linhas de import no topo dos arquivos, usamos arquivos index.ts que exportam tudo de uma pasta.
🧱 Smart vs Dumb (Revisited)
Em arquiteturas profissionais:
* Smart Components ficam na pasta features/.
* Dumb Components ficam na pasta shared/ ou dentro da pasta de uma feature específica se não forem genéricos.
🚀 Prática: Refatoração de Arquitetura
Vamos reorganizar nosso projeto bagunçado!
1. Crie as pastas core, shared e features.
2. Mova os serviços de autenticação para core.
3. Crie um componente de botão estilizado dentro de shared.
4. Organize as páginas existentes dentro de features.
🏁 Mini-Projeto da Aula
Desenhe um diagrama de pastas para um sistema de E-commerce que contenha: Autenticação, Catálogo, Carrinho e Perfil do Usuário. Aplique os conceitos de Core, Shared e Features.
Aula 14: Estilização Moderna e Componentes de UI 🎨
Nesta aula, vamos aprender como deixar nossa aplicação Angular bonita, profissional e responsiva, explorando o CSS isolado e as bibliotecas de componentes.
👗 Estilização Isolada (View Encapsulation)
Por padrão, o CSS que você escreve em um componente não vaza para o resto da aplicação. O Angular adiciona atributos únicos ao HTML para garantir esse isolamento.
Tipos de Encapsulamento
- Emulated (Padrão): Simula o isolamento via atributos.
- None: O CSS se torna global.
- ShadowDom: Usa a tecnologia nativa do browser para isolamento total.
📦 Bibliotecas de Componentes
Não precisamos reinventar a roda. Podemos usar bibliotecas que já trazem botões, modais e tabelas prontas.
- Angular Material: A biblioteca oficial seguindo o Material Design.
- PrimeNG: Uma das mais completas, com centenas de componentes.
- Tailwind CSS: Uma abordagem baseada em classes utilitárias que está dominando o mercado.
🛠️ Instalando Angular Material
Após instalado, basta importar os módulos (ou diretivas standalone) que deseja usar:
🌓 Variáveis CSS e Temas
Use variáveis CSS (--cor-primaria) para facilitar a criação de temas (Light/Dark Mode).
🌟 Animações no Angular
O Angular possui um módulo potente para animações de transição de estados.
graph LR
A[Estado: Inicial] --> |Transição| B[Estado: Final]
B --> |Trigger| C[Animação na Tela]
🚀 Prática: Interface Premium
Vamos transformar nossa listagem de produtos simples em uma vitrine de luxo:
1. Instale o Angular Material.
2. Use o MatCard para exibir os itens.
3. Adicione um MatToolbar como cabeçalho.
4. Implemente um botão que abre um MatDialog (modal) para ver mais detalhes.
🏁 Mini-Projeto da Aula
Crie uma página de perfil de usuário "Dark Mode" usando apenas variáveis CSS. O usuário deve conseguir alternar entre o tema claro e escuro clicando em um botão que altera uma classe no body da aplicação.
Aula 15: Build, Deploy e Performance 🚀
Nesta aula, vamos aprender como preparar nossa aplicação para o mundo real, otimizando o tamanho do código e publicando o site na internet.
🏗️ O Processo de Build
Quando desenvolvemos, usamos o ng serve. Para produção, precisamos gerar arquivos estáticos (HTML/JS/CSS) otimizados usando o comando build.
Os arquivos serão gerados na pasta dist/nome-do-projeto.
🌍 Gerenciando Ambientes
Você pode ter configurações diferentes para desenvolvimento e produção (ex: URLs de API). No Angular moderno, usamos as configurações de fileReplacements no angular.json ou arquivos de variáveis de ambiente.
Exemplo de Uso
environment.ts (Dev) vs environment.prod.ts (Produção).
🚀 Deploy no GitHub Pages
Uma das formas mais fáceis de hospedar seu projeto Angular gratuitamente.
⚡ Performance: Lighthouse
Devemos sempre verificar se nosso site está rápido e acessível. O Lighthouse (no Chrome DevTools) analisa: * Performance (tempo de carregamento). * Acessibilidade (uso de leitores de tela). * Melhores Práticas. * SEO.
🌟 Estratégias de Otimização
- Lazy Loading: Já vimos que carregar por demanda reduz o bundle inicial.
- Budget: O Angular permite definir alertas se o arquivo JS ficar grande demais.
- Images: Use formatos modernos (WebP) e carregamento ocioso (lazy).
🚀 Prática: Deploy da Nossa App
Vamos realizar o ciclo completo: 1. Criar os arquivos de ambiente. 2. Executar o build de produção. 3. Publicar no GitHub Pages (ou simular com um servidor local). 4. Rodar um relatório do Lighthouse e ajustar o que for necessário.
🏁 Mini-Projeto da Aula
Configure as "budgets" no seu arquivo angular.json para emitir um aviso se o pacote principal (main bundle) ultrapassar 1MB. Tente identificar qual parte da sua aplicação (ex: ícones ou bibliotecas pesadas) está consumindo mais espaço.
Aula 16: Projeto Final Integrador 🏆
Chegamos ao fim da nossa jornada! Esta aula é dedicada à consolidação de todo o conhecimento que adquirimos, através do desenvolvimento de uma aplicação completa do zero ao deploy.
📝 O Desafio Final
Você deverá construir um Gerenciador de Filmes/Séries Personalizado utilizando todas as tecnologias estudadas.
Requisitos Técnicos:
- Arquitetura: Uso obrigatório de Standalone Components e estrutura de pastas Core/Shared/Features.
- Roteamento: Navegação entre Listagem, Detalhes e Cadastro.
- Comunicação: Uso de
@Inpute@Outputpara criar componentes reutilizáveis (cards e botões). - Serviços e HTTP: Consumir a API do TMDB ou simular com JSON Server.
- Formulários: Criar um formulário reativo para "Adicionar aos Favoritos" ou "Avaliar Filme".
- RxJS: Implementar uma busca em tempo real com operadores de filtragem e cancelamento.
- Estilização: Uso de Angular Material ou Tailwind CSS para uma interface moderna.
🗺️ Mapa de Competências
mindmap
root((Angular Course))
Fundamentos
Componentes
Módulos vs Standalone
Data Binding
Lógica Profissional
Services
DI
HTTP Client
Reatividade
RxJS
Observables
Async Pipe
Entrega
Build
Performance
Deploy
🚀 Dicas para o Sucesso
- Planeje antes: Desenhe as telas e o fluxo de dados no papel ou em uma ferramenta como o Figma.
- Commit constante: Use o Git para salvar seu progresso passo a passo.
- Documente: No README do seu projeto final, explique como rodá-lo e quais foram os maiores desafios.
🎁 Próximos Passos na Carreira
Parabéns! Você agora domina o Angular. O que estudar a seguir? * Signals: A novidade que está mudando a reatividade no Angular. * SSR (Server Side Rendering): Usando Angular Universal para SEO. * NGRX: Para gerenciamento de estado global em apps gigantescas.
🏁 Encerramento
Foi um prazer acompanhar você nesta trilha. O mercado de Frontend está sempre evoluindo, e com as bases sólidas que você construiu aqui, o sucesso é apenas uma questão de prática e dedicação.
Boa sorte com seu Projeto Final! 🚀
Exercícios
Banco de Exercícios 🏋️
Pratique os conceitos aprendidos em cada módulo com estas listas de exercícios práticos.
| Aula | Tópico | Material |
|---|---|---|
| 01 | Introdução e Ambiente | Acessar Exercícios |
| 02 | Estrutura e Componentes | Acessar Exercícios |
| 03 | Data Binding | Acessar Exercícios |
| 04 | Diretivas | Acessar Exercícios |
| 05 | Comunicação @Input/@Output | Acessar Exercícios |
| 06 | Serviços e DI | Acessar Exercícios |
| 07 | Roteamento Clássico | Acessar Exercícios |
| 08 | Standalone Components | Acessar Exercícios |
| 09 | Roteamento Standalone | Acessar Exercícios |
| 10 | Formulários | Acessar Exercícios |
| 11 | HTTP Client | Acessar Exercícios |
| 12 | RxJS Reativo | Acessar Exercícios |
| 13 | Arquitetura Profissional | Acessar Exercícios |
| 14 | Estilização e UI | Acessar Exercícios |
| 15 | Build e Performance | Acessar Exercícios |
| 16 | Projeto Integrador | Acessar Checklist |
Exercícios: Aula 01 📝
Pratique os conceitos básicos de Angular e preparação de ambiente.
Básico
- Conceito de SPA: Explique com suas palavras a principal diferença entre uma aplicação SPA e uma aplicação web tradicional (Multi-Page).
- Angular CLI: Qual é o comando utilizado para verificar a versão instalada do Angular CLI e do Node.js?
Intermediário
- Novo Projeto: Descreva os passos necessários para criar um novo projeto chamado
academia-angular, desabilitando os testes iniciais (dica: procure por--skip-tests). - Estrutura de Pastas: Para que serve o arquivo
angular.jsone por que ele é importante para o desenvolvedor?
Desafio
- Execução e Alteração: Crie um projeto, execute-o usando
ng servee altere o conteúdo do título no componente raiz. Adicione também um novo parágrafo<p>com seu nome e o nome da sua cidade no arquivoapp.component.html.
Exercícios: Aula 02 📝
Pratique a organização de arquivos e a criação de componentes.
Básico
- Componentes: Quais são os quatro arquivos gerados automaticamente pelo comando
ng generate component nome-do-componente? - Seletores: Para que serve a propriedade
selectornos metadados de um componente?
Intermediário
- Registro de Módulo: Na abordagem clássica, em qual array do
NgModuleo CLI adiciona o novo componente automaticamente? - CLI: Como você criaria um componente dentro de uma subpasta chamada
components, usando apenas um comando do CLI? (Exemplo: criarlogindentro desrc/app/components/login).
Desafio
- Layout Aninhado: Crie um componente chamado
Paie outro chamadoFilho. Tente exibir o componenteFilhodentro do template do componentePai. Depois, exiba o componentePainoApp.component. Descreva o resultado visual.
Exercícios: Aula 03 📝
Pratique a comunicação entre lógica e visual.
Básico
- Interpolação: Crie uma variável
titulono seu componente e exiba-a no HTML usando a sintaxe correta. - Property Binding: Como você alteria dinamicamente a cor de fundo de uma
divusando Property Binding com a propriedadestyle.background-color?
Intermediário
- Event Binding: Crie uma função que exiba no console do navegador o que o usuário está digitando em um campo
<input>. (Dica: use o evento(input)ou(keyup)). - Two-way Binding: Explique por que o
[(ngModel)]é chamado de "Banana in a Box". Qual módulo deve ser importado para que ele funcione?
Desafio
- Calculadora Simples: Crie dois campos de input (numéricos) e exiba a soma desses dois valores em tempo real na tela, conforme o usuário digita. Use Two-way binding.
Exercícios: Aula 04 📝
Pratique a manipulação do DOM com diretivas.
Básico
- ngIf: Crie um botão "Exibir Detalhes". Ao clicar, um parágrafo de texto deve aparecer ou desaparecer da tela usando
*ngIf. - ngFor: Crie um array de strings chamado
habilidades. Use o*ngForpara listar essas habilidades em uma lista não ordenada (<ul>).
Intermediário
- ngClass: Crie uma variável
importante(boolean). Use a diretivangClasspara aplicar a classe CSS.texto-vermelhoa um elemento apenas quandoimportantefor verdadeiro. - ngStyle: Crie um controle de "Tamanho do Texto" (um input range). Use
ngStylepara que o tamanho da fonte de um parágrafo mude conforme o valor do input.
Desafio
- Filtro Simples: Crie uma lista de números de 1 a 10. Use o
*ngForpara exibir os números, mas adicione um*ngIfinterno (em um container ou elemento) para que apenas os números pares sejam mostrados na lista final.
Exercícios: Aula 05 📝
Pratique a troca de dados entre componentes.
Básico
- Input: No componente
Usuario, receba uma variávelnomevia@Input(). Exiba esse nome no template HTML. - Output: Crie um evento
@Output()chamadoaoCurtirem um componente de Foto. O evento deve disparar toda vez que o usuário clicar em um ícone de coração.
Intermediário
- Objeto Inteiro: É possível passar um objeto inteiro (como um
Produtocom nome, preco e img) via@Input()? Como seria a sintaxe no componente pai para passar esse objeto? - EventEmitter: Qual a finalidade do comando
this.meuEvento.emit(valor)dentro de uma função do componente filho?
Desafio
- Carrinho de Compras: Crie um componente
ProdutoItem. O pai deve passar as informações do produto via@Input. O filho deve ter um botão "Adicionar ao Carrinho". Ao clicar, o pai deve receber a notificação, receber o ID do produto e aumentar um contador de itens no carrinho que fica no topo da página.
Exercícios: Aula 06 📝
Pratique a criação de serviços e o compartilhamento de dados.
Básico
- Geração: Qual o comando CLI completo para gerar um serviço chamado
Configdentro da pastacore/services? - ProvidedIn: O que significa o parâmetro
{ providedIn: 'root' }dentro do decorator@Injectable?
Intermediário
- Injeção: Como você injeta um serviço chamado
LogServicedentro do construtor de um componente? Escreva a linha de código. - Singleton: Se dois componentes diferentes injetarem o mesmo serviço e um deles alterar uma variável dentro desse serviço, o outro componente verá a mudança? Justifique.
Desafio
- Simulação de API: Crie um serviço chamado
PostService. Ele deve ter um método que retorne um array de objetos (comtituloeautor). Injete esse serviço em um componente e use o*ngForpara exibir esses posts formatados como cards no HTML.
Exercícios: Aula 07 📝
Pratique a navegação em SPAs.
Básico
- Tag Principal: Qual é a tag HTML que deve ser colocada no template para que as rotas sejam renderizadas?
- Link Interno: Qual diretiva substitui o atributo
hrefdo HTML tradicional para evitar o refresh da página?
Intermediário
- Parâmetros: Como você define uma rota que aceita um parâmetro chamado
usernameno array de rotas? - Redirect: Como configurar uma rota para que, quando o usuário digitar uma URL inexistente, ele seja redirecionado para a
/home?
Desafio
- Navegação via Código: Além do
routerLinkno HTML, como você faria para navegar para a rota/dashboarddentro de uma função no TypeScript? (Dica: Pesquise sobre o serviçoRoutere o métodonavigate).
Exercícios: Aula 08 📝
Pratique a transição para o Angular Moderno.
Básico
- Flag Standalone: Qual propriedade deve ser adicionada ao decorator
@Componentpara torná-lo um componente independente? - Imports: Onde são importadas as dependências (como
CommonModuleou outros componentes) na abordagem Standalone?
Intermediário
- Bootstrap: Qual função substitui o
platformBrowserDynamic().bootstrapModule()no arquivomain.tsde uma aplicação puramente standalone? - CLI: Escreva o comando do CLI para gerar um componente chamado
VideoPlayerque seja standalone desde a sua criação.
Desafio
- Migração: Imagine que você tem um componente clássico registrado no
AppModule. Liste os 3 passos principais que você faria para transformá-lo em um componente Standalone pronto para ser usado sem módulos.
Exercícios: Aula 09 📝
Pratique a navegação no Angular Moderno.
Básico
- Provedor de Rota: Qual função substitui o
RouterModule.forRoot()para configurar rotas em uma aplicação standalone? - Importação no Componente: Se eu quero usar o
router-outletem um componente standalone, o que devo adicionar ao seu decorator@Component?
Intermediário
- loadComponent: Qual a principal diferença entre a propriedade
componente a propriedadeloadComponentna definição de uma rota? - Configuração de App: No arquivo
main.ts, onde passamos a configuração do roteador para a funçãobootstrapApplication?
Desafio
- Refatoração de Lazy Loading: Transforme a rota abaixo, que usa módulos, para o formato standalone usando componente: Escreva como ficaria a nova versão.
Exercícios: Aula 10 📝
Pratique a criação de formulários e validações.
Básico
- Abordagens: Quais são as duas principais formas de criar formulários no Angular?
- ngModel: Em qual das abordagens o
ngModelé a peça central para capturar os dados?
Intermediário
- Validators: Cite 3 validadores nativos do Angular (ex:
Validators.required) e explique o que cada um faz. - FormGroup: No Reactive Forms, para que serve o
FormGroupe como ele se relaciona com oFormControl?
Desafio
- Formulário Reativo: Crie um pequeno código TypeScript de um
FormGroupque tenha dois campos:idade(mínimo 18) etermoAceite(deve ser verdadeiro). Como você configuraria esses validadores?
Exercícios: Aula 11 📝
Pratique a integração com serviços externos.
Básico
- Configuração: Qual utilitário devemos adicionar ao array de
providersno bootstrap da aplicação para liberar o uso de requisições HTTP? - Verbos HTTP: Quais são os 4 verbos HTTP mais comuns usados em APIs REST para CRUD (Create, Read, Update, Delete)?
Intermediário
- Tipagem: Como você definiria a tipagem do retorno de um
http.getpara que ele retorne um array de uma interface chamadaIUsuario? - Assincronismo: O que acontece se você esquecer de chamar o método
.subscribe()após uma requisiçãohttp.get()no seu componente?
Desafio
- Tratamento de Erros: Pesquise como o método
.subscribe()pode receber um objeto comnexteerror. Escreva um exemplo de código que trate o erro caso a API de busca de CEP retorne um erro 404.
Exercícios: Aula 12 📝
Pratique a manipulação de fluxos de dados com RxJS.
Básico
- Conceito: Qual a principal diferença entre um Observable e uma Promise?
- Async Pipe: Qual o benefício de usar o pipe
| asyncno HTML em vez de fazer o.subscribe()manualmente no TypeScript?
Intermediário
- map vs filter: Explique a diferença de comportamento entre o operador
mape o operadorfilter. - BehaviorSubject: Por que o
BehaviorSubjecté geralmente preferido em relação aoSubjectcomum para armazenar o estado atual de um usuário logado?
Desafio
- Encadeamento: Escreva um exemplo de código usando
.pipe()que receba uma lista de números, multiplique cada um por 2 (usemap) e depois retorne apenas os números que forem maiores que 10 (usefilter).
Exercícios: Aula 13 📝
Pratique a organização de projetos escaláveis.
Básico
- LIFT: O que significa o acrônimo LIFT nas recomendações de estilo do Angular?
- Pasta Core: Que tipo de arquivos costumamos colocar dentro da pasta
core/? Cite 2 exemplos.
Intermediário
- Shared vs Core: Qual a principal diferença entre a pasta
shared/e a pastacore/em termos de instância e uso? - Barrel Files: Explique para que serve um arquivo
index.tsdentro de uma pasta de componentes.
Desafio
- Proposição de Estrutura: Imagine que você vai criar um módulo de "Gestão de Estoque". Quais pastas e arquivos você criaria para seguir a arquitetura de "Features" ensinada na aula? Descreva a hierarquia.
Exercícios: Aula 14 📝
Pratique a criação de interfaces modernas.
Básico
- Isolamento: Explique o que é o "Encapsulamento de Estilo" do Angular e qual a sua principal vantagem.
- Angular Material: Qual o comando do CLI para instalar o Angular Material em um projeto existente?
Intermediário
- Variáveis CSS: Como você definiria uma variável CSS chamada
--main-bge a utilizaria em um seletor.container? - Tailwind: Qual a principal diferença filosófica entre usar Angular Material e usar Tailwind CSS?
Desafio
- Tematização: Escreva um pequeno trecho de código CSS que mude a cor de fundo de um botão quando a classe
.dark-themeestiver presente em um elemento pai (como obody).
Exercícios: Aula 15 📝
Pratique a entrega final da sua aplicação.
Básico
- Build: Qual o comando do CLI para gerar os arquivos finais de produção de um projeto Angular?
- Destino: Para qual pasta (por padrão) o Angular envia os arquivos gerados após o comando de build?
Intermediário
- base-href: Para que serve a flag
--base-hrefdurante o processo de build para deploy no GitHub Pages? - Otimização: O que o processo de "Minificação" e "Uglification" (ofuscação) faz com o seu código JavaScript final?
Desafio
- Análise de Performance: Abra o site que você criou, pressione F12 (DevTools), vá na aba "Lighthouse" e gere um relatório de Desktop. Liste 2 sugestões de melhoria que o relatório deu para o seu projeto.
Projeto Final: Checklist de Entrega 📑
Use este checklist para garantir que seu projeto final atenda a todos os requisitos do curso.
Estrutura
- [ ] O projeto utiliza apenas Standalone Components?
- [ ] O projeto segue a organização de pastas Core, Shared e Features?
- [ ] O arquivo
app.module.tsfoi removido e o bootstrap ocorre viamain.ts?
Funcionalidades
- [ ] Existe navegação entre pelo menos 3 rotas diferentes?
- [ ] Há consumo de uma API externa (ou JSONPlaceholder) via HttpClient?
- [ ] Foi implementado um formulário do tipo Reativo com validações?
- [ ] Existe uma busca em tempo real usando operadores RxJS?
Design e UX
- [ ] A interface utiliza Angular Material ou Tailwind CSS?
- [ ] O site é responsivo (funciona bem em celular e desktop)?
- [ ] Existe feedback visual para o usuário (loading spinners ou mensagens de erro)?
Finalização
- [ ] O projeto foi publicado no GitHub Pages?
- [ ] O README contém instruções de instalação e uso?
- [ ] Todas as dependências inúteis foram removidas do
package.json?
Projetos
Projetos e Portfólio 🚀
Consolide seu conhecimento construindo aplicações do mundo real sugeridas ao final de cada aula.
📝 Mini-Projetos de Aula
Cada aula contém um "Mini-Projeto" específico em seu conteúdo. Verifique as páginas das aulas para os desafios individuais.
🏆 Projeto Final Integrador
O objetivo final é a construção de um Gerenciador de Mídia reativo, integrando todas as fases do curso.
Projeto 01: Meu Primeiro App Angular 🚀
Objetivo
Criar uma aplicação Angular básica e realizar as primeiras alterações visuais.
Requisitos
- [ ] Instalar o Angular CLI.
- [ ] Criar um projeto chamado
aula-01-projeto. - [ ] Alterar o título no arquivo
app.component.html. - [ ] Adicionar um parágrafo com uma breve descrição sobre você.
- [ ] Executar o projeto no navegador usando
ng serve.
Desafio Extra
Tente mudar a cor do parágrafo que você criou usando CSS no arquivo app.component.css.
Projeto 02: Layout com Componentes 🏗️
Objetivo
Praticar a criação e organização de componentes para formar um layout de Dashboard.
Requisitos
- [ ] Criar quatro componentes:
Header,Sidebar,ContenteFooter. - [ ] Organizar o
app.component.htmlpara que o Header fique no topo, a Sidebar na esquerda e o Content no centro. - [ ] Adicionar cores de fundo diferentes para cada componente para identificá-los.
Desafio Extra
Crie um componente chamado Card e tente repetir ele 3 vezes dentro do componente Content.
Macro Syntax Error
File: projetos/projeto-03.md
Line 9 in Markdown file: Expected an expression, got 'end of print statement'
Projeto 04: Lista de Tarefas (Todo) v1 ✅
Objetivo
Aplicar diretivas estruturais para gerenciar uma lista de itens.
Requisitos
- [ ] Criar um array de tarefas no TypeScript.
- [ ] Usar
*ngForpara listar as tarefas na tela. - [ ] Usar
*ngIfpara exibir uma mensagem "Nenhuma tarefa pendente" se a lista estiver vazia. - [ ] Criar um input para adicionar novas tarefas à lista.
Desafio Extra
Adicione um botão ao lado de cada tarefa que permita removê-la da lista.
Projeto 05: Galeria de Produtos 🛒
Objetivo
Praticar a comunicação entre componentes usando @Input e @Output.
Requisitos
- [ ] Criar um componente pai
Cataloge um componente filhoProductCard. - [ ] O pai deve enviar as informações do produto via
@Inputpara o filho. - [ ] O filho deve ter um botão "Comprar" que emite um evento via
@Output. - [ ] O pai deve exibir um alerta com o nome do produto sempre que o botão for clicado no filho.
Desafio Extra
Crie uma variável "Carrinho" no componente pai que conte quantos produtos foram clicados.
Projeto 06: Controle de Estoque com Serviços 📦
Objetivo
Centralizar a lógica de dados em um serviço para compartilhamento entre componentes.
Requisitos
- [ ] Criar um
EstoqueServicecom uma lista privada de produtos. - [ ] Implementar métodos
adicionar()elistar()no serviço. - [ ] Criar dois componentes: um formulário para adicionar e uma lista para exibir.
- [ ] Ambos os componentes devem injetar e usar o mesmo serviço.
Desafio Extra
Implemente um método no serviço para remover um item pelo ID e use-o no componente de lista.
Projeto 07: Site Institucional 🗺️
Objetivo
Configurar o roteamento clássico (NgModule) para criar uma navegação entre páginas.
Requisitos
- [ ] Criar três componentes representando as páginas:
Home,SobreeContato. - [ ] Configurar o arquivo
app-routing.module.ts. - [ ] Usar
<router-outlet>no layout principal. - [ ] Criar uma barra de navegação com
routerLink.
Desafio Extra
Adicione uma rota curinga (**) para lidar com páginas não encontradas, exibindo um componente de erro 404.
Projeto 08: Perfil do Usuário Standalone 📦
Objetivo
Migrar a aplicação para o modelo moderno de Standalone Components.
Requisitos
- [ ] Criar um componente
Perfilcom a flag--standalone. - [ ] Importar o
CommonModulediretamente no componente. - [ ] Rodar a aplicação usando
bootstrapApplication(AppComponent)nomain.ts. - [ ] Remover o arquivo
app.module.tsse possível.
Desafio Extra
Importe um componente standalone dentro de outro componente standalone e use-o no template.
Projeto 09: App de Notícias com Roteamento Moderno 🗺️
Objetivo
Configurar o roteamento em uma aplicação puramente standalone.
Requisitos
- [ ] Usar a função
provideRouter()nomain.ts. - [ ] Criar rotas para
NoticiaseEsportes. - [ ] Implementar Lazy Loading usando
loadComponent. - [ ] Importar
RouterOutleteRouterLinknos componentes standalone necessários.
Desafio Extra
Passe um parâmetro de ID na URL da notícia e exiba-o na tela do componente de detalhe.
Projeto 10: Formulário de Contato Reativo 📝
Objetivo
Desenvolver um formulário robusto com validações em tempo real usando Reactive Forms.
Requisitos
- [ ] Criar um
FormGroupcom os campos: Nome, E-mail e Assunto. - [ ] Adicionar validadores:
requiredpara todos eemailpara o campo de e-mail. - [ ] Exibir mensagens de erro apenas quando o campo for "touched" e estiver "invalid".
- [ ] Desabilitar o botão de envio até que o formulário seja válido.
Desafio Extra
Crie um validador personalizado que impeça o uso de e-mails de domínios específicos (ex: teste.com).
Projeto 11: Buscador de CEP (ViaCEP) 🌐
Objetivo
Conectar a aplicação ao mundo real consumindo uma API REST externa.
Requisitos
- [ ] Habilitar o
provideHttpClient()no bootstrap. - [ ] Criar um serviço para realizar a chamada ao
https://viacep.com.br/ws/. - [ ] Injetar o serviço no componente e processar o retorno no
.subscribe(). - [ ] Exibir o Logradouro, Bairro e Cidade na tela.
Desafio Extra
Trate o erro caso o CEP digitado não exista ou tenha formato inválido, exibindo uma mensagem amigável.
Projeto 12: Barra de Busca Inteligente com RxJS ⚡
Objetivo
Usar operadores de fluxo de dados para otimizar pesquisas em tempo real.
Requisitos
- [ ] Criar um campo de busca que emite eventos a cada tecla digitada.
- [ ] Usar
debounceTime(300)para não disparar requisições a cada letra. - [ ] Usar
switchMappara cancelar buscas anteriores se a atual mudar. - [ ] Exibir os resultados usando o
Async Pipeno HTML.
Desafio Extra
Use o operador distinctUntilChanged para evitar buscas idênticas consecutivas.
Projeto 13: Refactoring para Arquitetura Profissional 🏗️
Objetivo
Reorganizar a estrutura de pastas do projeto seguindo padrões de mercado.
Requisitos
- [ ] Criar as pastas
core/,shared/efeatures/. - [ ] Mover componentes de layout (NavBar, Footer) para a pasta correta.
- [ ] Mover serviços de autenticação ou globais para
core/. - [ ] Implementar Barrel Files (
index.ts) para exportar múltiplos componentes de uma pasta.
Desafio Extra
Crie uma pasta models/ dentro de shared/ e defina interfaces TypeScript para as principais entidades do seu projeto.
Projeto 14: Dashboard com Angular Material 🎨
Objetivo
Aplicar bibliotecas de componentes profissionais para elevar o nível visual da app.
Requisitos
- [ ] Instalar o Angular Material usando
ng add. - [ ] Usar o componente
MatToolbareMatButtonno cabeçalho. - [ ] Criar uma listagem de dados usando
MatTableouMatCard. - [ ] Implementar um botão de "Excluir" que abre um
MatDialogde confirmação.
Desafio Extra
Configure um tema personalizado alterando as cores primária e acento no arquivo de estilos globais.
Projeto 15: Deploy Real no GitHub Pages 🚀
Objetivo
Realizar o build oficial e publicar o projeto integrado na internet.
Requisitos
- [ ] Configurar os arquivos de
environment(dev/prod). - [ ] Executar o comando
ng build --base-href /seu-repositorio/. - [ ] Utilizar a ferramenta
angular-cli-ghpagespara fazer o upload. - [ ] Verificar o site rodando na URL pública do GitHub.
Desafio Extra
Rode um teste de Lighthouse no Chrome DevTools e tente atingir uma pontuação acima de 90 em Performance e Acessibilidade.
Projeto 16: Projeto Final - Gerenciador de Filmes 🏆
Objetivo
Construir uma aplicação completa integrando todos os pilares do curso Angular.
Requisitos
- [ ] Sistema 100% Standalone com Arquitetura Core/Shared/Features.
- [ ] Navegação completa entre Home, Busca de Filmes e Detalhes.
- [ ] Busca reativa (debounce, switchMap) consumindo a API do TMDB.
- [ ] Formulário de avaliação de filmes com validações.
- [ ] Design responsivo e moderno usando Material Design ou Tailwind.
- [ ] Deploy funcional no GitHub Pages.
Desafio Extra
Implemente a funcionalidade de "Favoritos" usando um BehaviorSubject para que o número de filmes favoritos atualize em tempo real no cabeçalho do site.
Quizzes
Quizzes de Conhecimento 🧠
Teste seu aprendizado com nossos quizzes rápidos por aula.
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
Galeria de Slides 📽️
Acesse a base teórica de cada aula em formato de slides interativos.
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
Setup e Ambiente 🛠️
Prepare sua máquina para o desenvolvimento profissional com Angular.
1. Node.js (Motor)
O Angular exige o Node.js em sua versão LTS (Long Term Support).
- Baixar Node.js
- Verifique a instalação:
node -venpm -v
2. Angular CLI (A Arrumadeira)
Instale a interface de linha de comando oficial globalmente.
3. VS Code (O Palácio)
Recomendamos o Visual Studio Code com as seguintes extensões: * Angular Language Service: Inteligência de código para Angular. * ESLint: Para manter o código limpo. * Prettier: Para formatação automática.
4. Extensões Úteis no Chrome
- Angular DevTools: Essencial para debugar componentes e performance.
Tudo pronto?
Siga para a vAula 01 para criar seu primeiro projeto!
Setup 01: Android Studio 🤖
O Android Studio é a IDE oficial para o desenvolvimento Android.
1. Requisitos de Sistema
- RAM: Mínimo 8GB (Sugerido 16GB+).
- Espaço: Mínimo 10GB para IDE + SDKs.
- Processador: Intel Core i5 ou equivalente.
2. Instalação
- Acesse o site oficial: developer.android.com/studio.
- Baixe a versão mais recente para o seu Sistema Operacional.
- Execute o instalador e escolha a opção "Standard" na configuração inicial.
3. Configurando o SDK
- Após a instalação, vá em Settings > Languages & Frameworks > Android SDK.
- Certifique-se de que a versão mais recente do Android (estável) esteja instalada.
- Na aba SDK Tools, instale o "Android Emulator" e o "Intel x86 Emulator Accelerator (HAXM)" se estiver no Windows com Intel.
4. Criando um Emulador (AVD)
- Abra o Device Manager.
- Clique em Create Device.
- Escolha um dispositivo (ex: Pixel 7).
- Selecione uma imagem de sistema (ex: Level 34 - Android 14).
- Finalize e clique no "Play" para iniciar o celular virtual.
5. Solução de Problemas ⚠️
- VT-x is disabled: Você precisa habilitar a virtualização na BIOS do seu computador.
- Studio muito lento: Adicione a pasta do projeto e as pastas do Android SDK nas exclusões do seu Antivírus.
Setup 02: Xcode (iOS Foundation) 🍎
O Xcode é a ferramenta necessária para compilar e testar apps iOS.
[!IMPORTANT] O Xcode requer um computador Mac (macOS).
1. Instalação
- Abra a App Store no seu Mac.
- Pesquise por Xcode.
- Clique em Obter/Instalar.
- Após o download, abra o Xcode para carregar os componentes adicionais do macOS.
2. Configurando Simuladores
- Vá em Settings > Platforms.
- Verifique se o componente "iOS" está baixado.
- Se não estiver, clique em "GET" para baixar a versão mais estável.
3. Comandos de Linha (CLI)
Para que ferramentas de automação funcionem, você precisa instalar os Command Line Tools:
4. Opcional: CocoaPods
Muitos projetos iOS antigos ainda usam CocoaPods para dependências:
5. Solução de Problemas ⚠️
- Espaço em Disco: O Xcode é muito grande. Garanta pelo menos 40GB de espaço livre para ele e os simuladores.
- Build Lento: Use simuladores de modelos mais simples (ex: iPhone SE) para poupar memória RAM se necessário.
Sobre
Sobre o Curso
🎓 Desenvolvimento Frontend com Angular
Este curso foi projetado para capacitar desenvolvedores na criação de SPAs (Single Page Applications) modernas, utilizando o framework Angular do Google. O diferencial é a transição guiada da arquitetura clássica (NgModule) para o modelo moderno e otimizado baseado em Standalone Components.
🎯 Objetivos do Curso
-
Ecossistema Angular --- Compreender a estrutura de projetos, o papel do Angular CLI e a arquitetura baseada em componentes.
-
Manipulação Dinâmica --- Dominar todos os tipos de Data Binding e o uso de diretivas para criar interfaces ricas e interativas.
-
Modernidade Standalone --- Aprender a desenvolver aplicações sem NgModules, simplificando o código e melhorando a performance.
-
Integração Reativa --- Consumir APIs REST de forma profissional utilizando RxJS e as melhores práticas de serviços injetáveis.
📚 O Que Você Vai Aprender
Módulo 1 – Fundamentos e Estrutura
- Ciclo de vida de um componente
- Instalação e uso avançado de CLI
- Arquivos principais (angular.json, main.ts)
- Templates e estilização isolada
Módulo 2 – Core e Comunicação
- Hierarquia Pai-Filho (@Input/@Output)
- Serviços Singleton e DI
- Diretivas Personalizadas
- Roteamento e Lazy Loading
Módulo 3 – Standalone e Formulários
- BootstrapApplication e provideRouter
- Refatoração de código legado para Standalone
- Validações síncronas e assíncronas em Forms
- HttpClient e tratamento de erros
Módulo 4 – RxJS e Deploy
- Operadores Pipe, Map, Filter
- BehaviorSubject para estados locais
- Angular Material e Design System
- Deploy em plataformas modernsas (Firebase/Vercel)
🛠️ Metodologia
Abordagem "Learning by Doing". Cada aula inclui uma seção teórica consolidada, exercícios progressivos e a construção incremental de um projeto que fará parte do seu portfólio profissional.
Pronto para ser um especialista Angular? Começar Agora
Roadmap do Projeto: Frontend com Angular 🚀
Este documento rastreia a evolução do curso.
✅ Fase 1: Planejamento (Concluído)
- [x] Definição Syllabus (16 Aulas)
- [x] Transição para Standalone Components (Angular 15+)
- [x] Configuração MkDocs Material com layout de cards
✅ Fase 2: Conteúdo Base (Concluído)
- [x] Criação das 16 Aulas (Markdown)
- [x] Criação dos 16 Quizzes (HTML)
- [x] Criação dos 16 Conjuntos de Exercícios
- [x] Criação dos 16 Slides (RevealJS)
✅ Fase 3: Projetos e UX (Em Andamento)
- [x] Definição dos 16 Projetos práticos
- [/] Diagramação Mermaid de arquitetura Angular
- [ ] Exemplos de integração HTTP reativa
🚀 Fase 4: Lançamento e Deploy
- [ ] Build e Deploy Gh-pages
- [ ] Validação de links e acessibilidade
- [ ] Publicação do Projeto Final
Status Atual: Em Refatoração Última Atualização: 21/02/2026
Materiais Complementares 📚
Bem-vindo à seção de materiais complementares do curso de Desenvolvimento Frontend com Angular. 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 e modernos.
-
- Pratique a criação de componentes e lógica Angular.
-
- Valide seu aprendizado com testes rápidos por aula.
-
- Construa aplicações reais do zero ao deploy.
-
- Guias de instalação (Node.js, CLI, VS Code).
-
- Documentação oficial do Angular para consulta.
Versão para Impressão
Esta página foi gerada automaticamente para impressão.