ホームページ >ウェブフロントエンド >jsチュートリアル >Angular でのゾーンレスの採用: 変更検出の新時代
2024 年 5 月 22 日にリリースされた Angular 18 では、実験的なゲームチェンジャーであるゾーンレス Angular アプリケーションが導入されました。 これにより、Zone.js への依存関係が排除され、パフォーマンスが向上し、オーバーヘッドが削減され、デバッグが簡素化されます。ゾーンレス アプリケーションとその利点、そしてこの機能の実験方法について詳しく見ていきましょう。
変更検出により、DOM とコンポーネント データの同期が維持されます。 以前、Angular は Zone.js に依存していました。 変更検出は次の方法でトリガーされます:
setTimeout
、setInterval
、Promise 解決。ApplicationRef.tick()
、ChangeDetectorRef.detectChanges()
.Zone.js はブラウザー API にパッチを適用し、Angular に変更検出を開始するよう通知しました。 これは効果的ではありましたが、オーバーヘッドが追加され、場合によっては ExpressionChangedAfterItHasBeenCheckedError
.
ゾーンレス変更検出の前に、Zone.js によって UI が更新されました。この StackBlitz の例は次のことを示しています。
ChangeDetectionStrategy.OnPush
では、参照の変更または変更検出が手動でトリガーされない限り、配列の直接変更によってビューが更新されない可能性があります。AsyncPipe
は、監視可能な処理を簡素化し、自動的にサブスクライブして変更検出をトリガーします。これらの例は、変更検出における Zone.js の役割を強調し、Angular の改善されたゾーンレス アーキテクチャの準備を整えます。
Zone.js を削除すると、次のような大きな利点があります。
ExpressionChangedAfterItHasBeenCheckedError
の問題とゾーン関連の複雑さが減少します。ゾーンレスに切り替えるには構成の変更が必要です:
app.config.ts
に、次を追加します:<code class="language-typescript">providers: [ provideExperimentalZonelessChangeDetection() ]</code>
provideZoneChangeDetection()
が存在する場合は削除します。
import '*zone.js';
を削除します。angular.json
で、zone.js
配列から polyfills
を削除します。<code class="language-json">"polyfills": []</code>
<code class="language-bash">npm uninstall zone.js</code>
この例は、Zone.js を使用しない変更検出を示します:
各シナリオを分析してみましょう:
期待どおりに動作します。
this.changeDetectorRef.markForCheck();
が必要か、シグナルを使用します:
修正バージョン (markForCheck
あり):
修正バージョン (シグナルあり):
ビューは自動的に更新されません:
修正バージョン (markForCheck
あり):
async
パイプの使用が推奨されます。
単純明快です。 async
パイプを使用します:
toSignal()
を使用してオブザーバブルをシグナルに変換します。
概要:
markForCheck()
またはシグナルが必要です。async
パイプを使用します。Angular 19 では、ゾーンレス アプリケーションのサポートがさらに洗練され、API が改善され、サーバー側のレンダリング サポートが追加され、テストが強化されました。 Angular CLI はゾーンレス プロジェクトの作成をサポートするようになりました:
<code class="language-typescript">providers: [ provideExperimentalZonelessChangeDetection() ]</code>
以上がAngular でのゾーンレスの採用: 変更検出の新時代の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。