Application Framework

Angular

Angular é o framework 'batteries-included': focado em TypeScript, com injeção de dependência nativa e uma estrutura opinativa que escala de um pequeno app até uma base de código empresarial robusta.

intermediate16 min readUpdated 15 de set. de 2026
counter.component.ts
ts
// counter.component.ts
import { Component, signal } from "@angular/core";

@Component({
  selector: "app-counter",
  standalone: true,
  template: `
    <button (click)="increment()">
      Clicked {{ count() }} times
    </button>
  `,
})
export class CounterComponent {
  count = signal(0);

  increment() {
    this.count.update((c) => c + 1);
  }
}
Mantido por
Google
Linguagem
TypeScript first
Versão principal
Angular 17+
Reatividade
Signals e RxJS
DI
Integrada ao framework
Escopo
Plataforma completa de aplicação

Por que importa

Por que empresas escolhem Angular

Batteries included

Roteamento, formulários, HTTP, testes e ferramentas já vêm inclusos, evitando que as equipes precisem montar uma stack com dezenas de pacotes não relacionados.

Estrutura opinativa

Convenções e injeção de dependência mantêm bases de código grandes consistentes, o que é fundamental quando muitos desenvolvedores compartilham o mesmo repo.

Feito para escala

Tipagem forte, uma CLI poderosa e a configuração de testes desde o primeiro dia tornam o Angular a escolha comum para apps empresariais de longa duração.

O panorama completo

As três ideias por trás do Angular

Uma árvore de componentes, injeção de dependência e uma camada reativa. O Angular entrega os três como um sistema coerente e opinativo.

Components

UI

Classes decoradas com @Component que unem um template à lógica e estilos.

Dependency injection

Wiring

Um container de primeira classe que provê e injeta serviços em toda a aplicação.

Reactivity

Change

Signals para estado local e observables do RxJS para streams, impulsionando a detecção de mudanças.

Angular em resumo

O núcleo do Angular

Components

Uma classe TypeScript, um template HTML e estilos, conectados por um decorator.

Templates & binding

Interpolação, property binding e event binding conectam a classe à view.

Signals

Valores reativos de grão fino que atualizam a view sem a necessidade de uma verificação completa.

RxJS

Observables e operadores para lidar com streams assíncronos de eventos.

Services & DI

Compartilhe lógica e dados através de serviços injetáveis em vez de importar globais.

Router

Configure rotas, guards e áreas de funcionalidades com lazy-loading de forma declarativa.

Uma breve historia

Do AngularJS a uma plataforma moderna

  1. 2010

    AngularJS

    O framework original populariza o two-way binding e as single-page applications.

    10
  2. 2016

    Reescrita Angular 2

    Uma reescrita completa do zero focada em componentes, TypeScript e um novo sistema de injeção de dependência.

    16
  3. 2020

    Ivy e strict mode

    Um novo compilador melhora o tamanho do bundle e permite uma verificação de tipos mais rigorosa.

    20
  4. 2023

    Signals e standalone

    Chegam os Signals e os standalone components tornam-se o padrão recomendado.

    23
  5. Today

    Uma plataforma moderna

    Deferred loading, detecção de mudanças zoneless e uma CLI unificada mantêm o Angular competitivo.

    Today

O guia completo

Angular: Tudo que voce precisa saber

O que é Angular?

Angular é um framework de aplicação completo mantido pelo Google. Enquanto o React é uma biblioteca em torno da qual você monta sua stack, o Angular já entrega a stack pronta: componentes, roteamento, formulários, HTTP, injeção de dependência, testes e uma CLI poderosa, tudo projetado para trabalhar em conjunto. Ele é focado em TypeScript e opinativo, que é exatamente o motivo pelo qual grandes equipes o escolhem.

Essa completude é a principal troca. Você aceita uma curva de aprendizado mais acentuada e mais convenções de framework em troca de consistência, ferramentas robustas e menos decisões arquiteturais para tomar do zero. Para um protótipo pequeno, isso pode parecer pesado; para uma base de código empresarial de cinco anos, costuma ser um alívio.

Componentes e templates

Um componente é uma classe TypeScript decorada com @Component, combinada com um template HTML e estilos opcionais.

// user-card.component.ts
import { Component, Input } from "@angular/core";

@Component({
  selector: "app-user-card",
  standalone: true,
  template: `
    <article class="card">
      <h3>{{ user.name }}</h3>
      <p>{{ user.email }}</p>
    </article>
  `,
})
export class UserCardComponent {
  @Input({ required: true }) user!: { name: string; email: string };
}

O template utiliza {{ }} para interpolação e diretivas para a lógica. O Angular moderno utiliza blocos de controle de fluxo nativos em vez das antigas diretivas estruturais.

<!-- list.html -->
@if (users.length > 0) {
  <ul>
    @for (user of users; track user.id) {
      <li>{{ user.name }}</li>
    }
  </ul>
} @else {
  <p>No users yet.</p>
}

A expressão track em @for desempenha o mesmo papel que uma key no React ou Vue: ela informa ao Angular como correlacionar os itens entre as atualizações.

Data binding

Os templates do Angular suportam quatro tipos de binding.

  • Interpolation {{ value }} renderiza um valor como texto.
  • Property binding [src]="url" define a propriedade de um elemento a partir de uma expressão.
  • Event binding (click)="save()" chama um método quando um evento é disparado.
  • Two-way binding [(ngModel)]="name" combina ambos para inputs de formulários.
<!-- bindings.html -->
<img [src]="user.avatar" [alt]="user.name" />
<button (click)="save()">Save</button>
<input [(ngModel)]="query" />

O two-way binding é conveniente para formulários simples, mas para qualquer coisa que exija validação, os reactive forms geralmente são a melhor escolha.

Signals

Signals são a primitiva de reatividade moderna do Angular. Um signal armazena um valor e notifica os consumidores interessados quando ele muda, o que permite que o framework atualize apenas as partes da view que dependem dele.

// cart.component.ts
import { Component, signal, computed } from "@angular/core";

@Component({
  selector: "app-cart",
  standalone: true,
  template: `<p>Total: {{ total() }}</p>`,
})
export class CartComponent {
  items = signal([{ price: 10 }, { price: 20 }]);

  total = computed(() =>
    this.items().reduce((sum, i) => sum + i.price, 0),
  );

  add(price: number) {
    this.items.update((items) => [...items, { price }]);
  }
}

computed deriva um valor de outros signals e o armazena em cache até que uma dependência mude. effect executa um side effect quando os signals que ele lê são alterados. Juntos, eles cobrem a maior parte do que os componentes precisam.

RxJS e observables

O Angular possui uma integração profunda com RxJS. Um observable representa um fluxo de valores ao longo do tempo, e os operadores permitem que você transforme e combine esses fluxos.

// search.component.ts
import { Component } from "@angular/core";
import { toSignal } from "@angular/core/rxjs-interop";
import { debounceTime, distinctUntilChanged, switchMap } from "rxjs";

@Component({ /* ... */ })
export class SearchComponent {
  private query$ = new Subject<string>();

  results = toSignal(
    this.query$.pipe(
      debounceTime(300),
      distinctUntilChanged(),
      switchMap((q) => this.api.search(q)),
    ),
    { initialValue: [] },
  );
}

É aqui que o RxJS mostra seu valor: debouncing, cancelamento de requisições obsoletas e a combinação de fluxos são difíceis de expressar usando apenas promises. Para estados síncronos simples, signals são mais simples. O Angular moderno permite que você misture ambos e realize a conversão com toSignal e toObservable.

Serviços e injeção de dependência

Lógicas e dados compartilhados pertencem a serviços, não a componentes. A injeção de dependência os fornece onde quer que sejam necessários.

// users.service.ts
import { Injectable, inject } from "@angular/core";
import { HttpClient } from "@angular/common/http";

@Injectable({ providedIn: "root" })
export class UsersService {
  private http = inject(HttpClient);

  getAll() {
    return this.http.get<User[]>("/api/users");
  }
}
// users.component.ts
export class UsersComponent {
  private users = inject(UsersService);
  list = toSignal(this.users.getAll(), { initialValue: [] });
}

providedIn: "root" registra um singleton para todo o app. A DI torna a substituição de serviços simples em testes e mantém os componentes focados na apresentação.

Roteamento

O Angular Router mapeia URLs para componentes e suporta rotas aninhadas, guards, resolvers e lazy loading.

// app.routes.ts
import { Routes } from "@angular/router";

export const routes: Routes = [
  { path: "", component: HomeComponent },
  { path: "users/:id", component: UserProfileComponent },
  {
    path: "admin",
    loadChildren: () => import("./admin/admin.routes").then((m) => m.ADMIN_ROUTES),
  },
];

O recurso de lazy loading mantém o bundle inicial pequeno, e os guards permitem bloquear a navegação até que uma condição, como a autenticação, seja atendida.

Formulários e HTTP

O Angular possui duas abordagens para formulários. Reactive forms definem o modelo e os validadores na classe, o que escala bem e é fácil de testar. Template-driven forms utilizam diretivas como ngModel e são mais rápidos para casos simples.

// signup.component.ts
form = new FormGroup({
  email: new FormControl("", [Validators.required, Validators.email]),
  password: new FormControl("", [Validators.required, Validators.minLength(8)]),
});

submit() {
  if (this.form.invalid) return;
  this.http.post("/api/signup", this.form.getRawValue()).subscribe();
}

HttpClient retorna observables, portanto as requisições são compostas com operadores RxJS para tentativas de reenvio (retries), cancelamento e tratamento de erros.

Melhores práticas

  • Prefira standalone components e signals para códigos novos.
  • Mantenha os componentes focados na apresentação e mova a lógica para services.
  • Use reactive forms para qualquer coisa que exija validação ou campos dinâmicos.
  • Utilize lazy-load em áreas de funcionalidades para manter o bundle inicial pequeno.
  • Use a detecção de mudanças OnPush ou signals para limitar verificações desnecessárias.
  • Rastreie itens em @for com um valor único estável.
  • Faça o unsubscribe de observables de longa duração, ou utilize o async pipe e toSignal.

Erros comuns

  • Colocar a lógica de negócio em componentes em vez de serviços.
  • Fazer a inscrição (subscribe) manualmente e esquecer de cancelar a inscrição, causando memory leaks.
  • Tentar usar RxJS quando um signal seria mais simples.
  • Mutar o valor de um signal diretamente em vez de usar set ou update.
  • Criar um único NgModule enorme em vez de rotas de funcionalidades com lazy-loading.
  • Tratar o Angular como se fosse React e lutar contra a estrutura do framework.

Próximos passos

O Angular recompensa a paciência com uma estrutura que se mantém sólida ao longo dos anos. Aprofunde seus conhecimentos em TypeScript, entenda como ele se compara ao React e ao Vue, e aprenda sobre as ferramentas de Node.js que alimentam sua CLI. Em seguida, crie uma funcionalidade com routing, um service e um reactive form para ver como todas as peças se encaixam.

Estado local

Signals são o padrão moderno para estado síncrono de componentes. Use RxJS quando você realmente tiver um stream.

Preferir
const count = signal(0);
count.update((c) => c + 1);
// read it in the template
// {{ count() }}
Evitar
count$ = new BehaviorSubject(0);
count$.next(
  this.count$.value + 1,
);
// needs an async pipe

Construção de formulários

Reactive forms mantêm o modelo na classe, o que escala melhor para validações e campos dinâmicos.

Reactive
form = new FormGroup({
  email: new FormControl("", [
    Validators.required,
    Validators.email,
  ]),
});
Template-driven
<form #f="ngForm">
  <input
    name="email"
    ngModel
    required
    email
  />
</form>

Perguntas frequentes

Perguntas frequentes

Keep learning

Related topics from the roadmap.

$ comecar a aprender

Pronto para aprender Angular?

Nosso tutorial interativo te guia por Angular passo a passo — com quizzes e codigo real que voce pode executar no navegador.