Новый Angular 19
 
        Angular 19 предлагает новые возможности для оптимизации и повышения эффективности разработки, фокусируясь на улучшении опыта разработчиков и производительности.
Автономные компоненты по умолчанию
Введение автономных компонентов в Angular 14 стало важным шагом. Теперь в Angular 19 они применяются автоматически, без необходимости явно указывать standalone: true.
До Angular 19:
@Component({
  standalone: true,
  imports: [CommonModule],
  selector: 'standalone-component',
  templateUrl: './standalone-component.html',
})
export class StandaloneComponent { }Сейчас:
@Component({
  imports: [CommonModule],
  selector: 'standalone-component',
  templateUrl: './standalone-component.html',
})
export class StandaloneComponent { }Это устраняет необходимость использования NgModule в большинстве случаев, делая структуру приложения проще и способствуя модульной разработке. Если NgModule всё же необходим, его можно явно задать с помощью standalone: false.
Быстрый рендеринг с частичной и постепенной гидратацией
Angular 19 оптимизирует приложения с рендерингом на сервере (SSR) благодаря частичной и постепенной гидратации.
- Частичная гидратация: приоритетно загружает критически важные компоненты, сокращая время загрузки.
- Инкрементная гидратация: откладывает загрузку некритичных элементов до взаимодействия пользователя (клика, наведения), экономя ресурсы.
Эти улучшения обеспечивают более быструю и отзывчивую работу приложения с самого начала.
Улучшенные сигналы: упрощение реактивности
Возможности работы с сигналами в Angular развиваются, с расширенной поддержкой и новыми инструментами, такими как LinkedSignal.
Что такое сигналы?
Сигналы — это API для реактивного и предсказуемого управления состоянием, уменьшая зависимость от Zone.js. Это упрощает отладку, повышает производительность и уменьшает размер приложения.
Пример с сигналами: знакомство с LinkedSignal
linkedSignal позволяет создавать зависимые сигналы, которые автоматически обновляются на основе исходного сигнала.
import { signal, linkedSignal } from '@angular/core';
const source = signal(10);
const double = linkedSignal(source, value => value * 2);
console.log(double()); // 20
source.set(15);
console.log(double()); // 30Улучшения API компонентов
Angular 19 добавляет новый хук жизненного цикла ngAfterSignalUpdate для реагирования на обновления сигналов. Это облегчает работу с сложными состояниями.
import { Component, Signal, signal, AfterSignalUpdate } from '@angular/core';
@Component({
  selector: 'app-signal-lifecycle',
  template: `
    <h3>Signal Lifecycle Demo</h3>
    <button (click)="updateSignal()">Update Signal</button>
  `,
})
export class SignalLifecycleComponent implements AfterSignalUpdate {
  mySignal = signal(0);
  updateSignal() {
    this.mySignal.set(this.mySignal() + 1);
  }
  ngAfterSignalUpdate() {
    console.log('Signal updated to:', this.mySignal());
  }
}Этот хук позволяет разработчикам эффективнее реагировать на изменения в пользовательском интерфейсе, связанные с сигналами, и упрощает работу с сложными состояниями.
Более быстрые сборки
Оптимизации в Angular CLI ускоряют сборку как в режиме разработки, так и в продакшене. Кэширование дополнительно повышает скорость итераций.
Пример: сборка с кэшем
ng build --optimization=true --build-cacheУлучшения внедрения зависимостей
Angular теперь автоматически выводит типы при внедрении зависимостей (DI), сокращая повторяющийся код и повышая безопасность типов.
Пример: Вывод типа в DI
// Before
constructor(private http: HttpClient) {}
// Now in Angular 19
constructor(private readonly httpClient) {}API-интерфейсы Resource и rxResource: упрощение асинхронных данных
Новые экспериментальные API-интерфейсы Resource и rxResource облегчают работу с асинхронными данными, предоставляя удобный способ работы как с промисами, так и с наблюдаемыми.
Свойства resource:
- status: отражает текущее состояние ресурса (загрузка, успех, ошибка).
- value: содержит данные после успешной загрузки.
- error: обрабатывает возможные ошибки.
Пример сrxResource
import { rxResource } from '@angular/core';
const data = rxResource(async () => {
  const response = await fetch('/api/data');
  return response.json();
});
data.value.subscribe(data => console.log(data));Эти инструменты обеспечивают единый подход к асинхронной работе с данными, что упрощает и интуитивно понятнее делает рабочие процессы.
Улучшенная маршрутизация
Angular 19 тесно интегрирует сигналы с маршрутизатором, что делает навигацию более реактивной и эффективной. Теперь обработка параметров маршрута и запросов становится реактивной.
Пример: использование сигналов с маршрутизатором
import { Component, inject, OnInit, Signal } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
@Component({
  selector: 'app-route-demo',
  template: `
    <h2>Route Demo</h2>
    <p>Route ID: {{ routeId() }}</p>
  `,
})
export class RouteDemoComponent implements OnInit {
  private route = inject(ActivatedRoute);
  routeId: Signal<string> = signal('');
  ngOnInit() {
    this.route.paramMap.subscribe(params => {
      this.routeId.set(params.get('id') ?? '');
    });
  }
}Бонус: Улучшения в Angular Material
Angular Material обзавёлся новыми стилями, функциями доступности и улучшенными компонентами. Например, компоненты mat-menu и mat-select стали более удобными и интуитивно понятными.
Пример: Улучшенное использование mat-menu
<button mat-button [matMenuTriggerFor]="menu">Menu</button>
<mat-menu #menu="matMenu">
  <button mat-menu-item>Item 1</button>
  <button mat-menu-item>Item 2</button>
  <button mat-menu-item>Item 3</button>
</mat-menu>Заключение
Angular 19 знаменует собой значительный шаг в развитии фреймворка. От стандартных автономных компонентов до улучшенной реактивности с сигналами и оптимизациями SSR, эта версия предоставляет инструменты для создания более быстрых, более реактивных и поддерживаемых приложений.
Команда к обновлению фреймворка
ng update @angular/core @angular/cli