mcpField
A
angular-zoneless

angular-zoneless

github.com/oguzhan18開発7169 回インストール31 週間前に更新
リポジトリ

angular-zoneless について

Angular 19+でゾーンレスの変更検知を導入する開発者向けガイドです。Signals、描画後のコールバック、非同期処理、テストに関するAPIを扱います。

主な機能

  1. 01ゾーンレス変更検知の有効化
  2. 02signal() と computed() の利用
  3. 03afterNextRender による描画後処理
  4. 04非同期データと手動検知の管理
  5. 05ゾーンレスモードでのテスト

活用シーン

  1. 01Angularアプリをゾーンレスモードへ移行
  2. 02描画後にDOM処理を初期化
  3. 03ゾーンレスアプリのテスト作成

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/oguzhan18/angular-ecosystem-skills --skill angular-zoneless

インストール後、Claude Code で/angular-zonelessを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/discussions/
_INDEX.md
references/docs/
_INDEX.md
references/issues/
_INDEX.md
references/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()
  ]
});

コメント