🚀 Capítulo 16: Módulos vs Standalone Components
🎯 Objetivo da Aula
Ao final desta aula, você entenderá a diferença entre a abordagem clássica do Angular (baseada em NgModule) e a abordagem moderna (baseada em Standalone Components), e saberá como criar e utilizar componentes independentes.
🏢 O Cenário Prático (Seu Desafio)
Os sistemas das naves antigas eram todos interligados em um único grande painel central (Módulos). Se uma peça quebrasse, o painel todo podia falhar. As naves novas usam sistemas modulares independentes (Standalone). Seu desafio é atualizar os sistemas da sua nave para essa nova era tecnológica!
🧠 Fundamentos: A Teoria Traduzida
Até a versão 14, o Angular exigia que todo componente pertencesse a um NgModule. O módulo dizia quais componentes podiam usar quais ferramentas.
1. A Era Clássica: NgModule
Os componentes eram declarados em um arquivo central (geralmente app.module.ts). Se você quisesse usar o FormsModule em um componente, precisava importar o FormsModule no arquivo do módulo.
2. A Nova Era: Standalone Components
A partir do Angular 14 (e padrão no 17+), os componentes podem ser independentes! Eles não precisam de um módulo. Cada componente diz o que ele mesmo precisa importar.
- Vantagens: Menos arquivos, código mais limpo e carregamento mais rápido (lazy loading mais fácil).
- Sintaxe: No decorador
@Component, adicionamosstandalone: truee a lista deimports.
📖 Exemplo Guiado: Criando um Componente Standalone
Vamos ver como fica a estrutura de um componente moderno e independente.
🛠️ Passo a Passo (Criando via CLI)
Para criar um componente standalone, a CLI moderna já faz isso por padrão. Mas se precisar forçar, use:
ng g c painel-novo --standalone🛠️ Passo a Passo (Estrutura do Código)
Abra o arquivo painel-novo.component.ts. Ele se parecerá com isto:
import { Component } from '@angular/core';
import { CommonModule } from '@angular/common'; // Importa diretivas básicas como *ngIf e *ngFor
import { FormsModule } from '@angular/forms'; // Se precisar de formulários
@Component({
selector: 'app-painel-novo',
standalone: true, // AQUI ESTÁ A MÁGICA!
imports: [CommonModule, FormsModule], // O componente importa suas próprias dependências
templateUrl: './painel-novo.component.html',
styleUrls: ['./painel-novo.component.css']
})
export class PainelNovoComponent {
// Lógica do componente
}🕹️ Como Executar e Testar no VS Code
- Se você estiver usando um projeto puramente standalone (gerado no Angular 17+), você não terá o arquivo
app.module.ts. - Para usar esse novo componente em outro lugar (ex: no
app.component.ts), você deve importá-lo diretamente no array deimportsdo componente onde vai usá-lo!
// app.component.ts
import { PainelNovoComponent } from './painel-novo/painel-novo.component';
@Component({
// ...
imports: [PainelNovoComponent], // Importa o componente standalone aqui
})🛠️ Prática Obrigatória 1
Crie um componente standalone chamado escudo-avancado. No HTML dele, use a diretiva *ngIf para mostrar a mensagem “Escudo Ativo”. Lembre-se de verificar se o CommonModule está no array de imports do arquivo .ts do componente, senão o *ngIf não funcionará!
🛠️ Prática Obrigatória 2
Tente importar o MiniCacaComponent (que criamos no Capítulo 7) dentro do seu novo componente painel-novo. Lembre-se que para um componente standalone importar outro, o outro também precisa ser standalone (ou exportado por um módulo).
🔑 Gabarito de Código/Fórmulas
Prática 1:
No escudo-avancado.component.ts:
import { CommonModule } from '@angular/common';
@Component({
selector: 'app-escudo-avancado',
standalone: true,
imports: [CommonModule], // Obrigatório para usar *ngIf
templateUrl: './escudo-avancado.component.html'
})