angular-zoneless について
Angular 19+でゾーンレスの変更検知を導入する開発者向けガイドです。Signals、描画後のコールバック、非同期処理、テストに関するAPIを扱います。
主な機能
- 01ゾーンレス変更検知の有効化
- 02signal() と computed() の利用
- 03afterNextRender による描画後処理
- 04非同期データと手動検知の管理
- 05ゾーンレスモードでのテスト
活用シーン
- 01Angularアプリをゾーンレスモードへ移行
- 02描画後にDOM処理を初期化
- 03ゾーンレスアプリのテスト作成
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ oguzhan18/ angular-ecosystem-skills --skill angular-zonelessインストール後、Claude Code で/angular-zonelessを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/discussions/_INDEX.mdreferences/docs/_INDEX.mdreferences/issues/_INDEX.mdreferences/releases/_INDEX.md詳細
Angular Zoneless
バージョン: Angular 19 以降(2025) タグ: Zoneless、変更検知、Signals、リアクティビティ
参考資料: Zoneless ガイド • Signals
API の変更
このセクションでは、最近のバージョン固有の API の変更について説明します。
-
新機能:provideZonelessChangeDetection — Zoneless モードを有効にします ソース
-
新機能:afterNextRender — zone.js を使わずに、レンダリング後にコードを実行します
-
新機能:Experimental Zoneless — Angular 17 から利用可能で、Angular 19 以降で安定版です
-
新機能:signal() + computed() — zone.js なしで動作します
ベストプラクティス
- Zoneless の変更検知を有効にします
export const appConfig: ApplicationConfig = {
providers: [
provideZonelessChangeDetection()
]
};
- リアクティビティにはシグナルを使用します
@Component({
changeDetection: ChangeDetectionStrategy.OnPush,
template: `
<p>Count: {{ count() }}</p>
<p>Double: {{ double() }}</p>
`
})
export class CounterComponent {
count = signal(0);
double = computed(() => this.count() * 2);
increment() {
this.count.update(c => c + 1);
}
}
- DOM 操作には afterNextRender を使用します
constructor() {
afterNextRender(() => {
// Runs after rendering, outside zone
this.initChart();
});
}
- 繰り返し行う操作には afterRender を使用します
constructor() {
afterRender(() => {
// Runs after every render
});
}
- zone.js を使わずに非同期処理を扱います
@Component({
template: `
@if (data$ | async; as data) {
{{ data.name }}
}
`
})
export class AsyncComponent {
data$ = from(fetch('/api/data')).pipe(
share()
);
}
- 必要に応じて ChangeDetectorRef を手動で使用します
constructor(private cdr: ChangeDetectorRef) {}
update() {
this.value = newValue;
this.cdr.markForCheck();
}
- polyfills から zone.js を削除します
// polyfills.ts
// Remove or comment out zone.js import
// import 'zone.js';
- リアクティブではない読み取りには untracked を使用します
import { untracked } from '@angular/core';
ngOnInit() {
// Read without creating dependency
const value = untracked(() => this.signal());
}
- ブラウザーイベントを処理します
@HostListener('click')
onClick() {
// Works without zone.js
this.count.update(c => c + 1);
}
- Zoneless モードでテストします
TestBed.configureTestingModule({
providers: [
provideZonelessChangeDetection()
]
});
コメント
Markdown 対応