Angular は、動的な Web アプリケーションの構築を簡素化する強力なフレームワークです。ただし、アプリケーションが成長するにつれて、パフォーマンスの問題が忍び込み、読み込み時間の低下、ユーザー エクスペリエンスの低下、スケーラビリティの低下につながる可能性があります。これらの問題の多くは、一般的なコーディング手法や設計上の選択から発生します。この記事では、初心者でも Angular アプリケーションを改善できるように、明確な例と実用的な解決策を提供しながら、これらのパフォーマンスの落とし穴を段階的に探っていきます。
Web アプリケーションのパフォーマンスは、ユーザーの満足度、維持率、さらには収益に直接影響します。高速で応答性の高い Angular アプリは、スムーズなユーザー インタラクション、検索エンジンのランキングの向上、そして全体的な成功を保証します。悪い習慣を理解して回避することで、アプリケーションのパフォーマンスを維持することができます。
Angular は、Zone.js を利用した変更検出メカニズムを使用して、アプリケーションの状態が変化するたびに DOM を更新します。ただし、不必要な再チェックやコンポーネントの実装が不十分な場合、このプロセスがリソースを大量に消費する可能性があります。
@Component({ selector: 'app-example', template: `<div>{{ computeValue() }}</div>`, }) export class ExampleComponent { computeValue() { console.log('Value recomputed!'); return Math.random(); } }
この例では、不要な場合でも、Angular の変更検出が実行されるたびに computeValue() が呼び出されます。
コストのかかる再計算を防ぐには、純粋なパイプ またはメモ化技術を使用してください。
@Component({ selector: 'app-example', template: `<div>{{ computedValue }}</div>`, }) export class ExampleComponent implements OnInit { computedValue!: number; ngOnInit() { this.computedValue = this.computeValue(); } computeValue() { console.log('Value computed once!'); return Math.random(); } }
代わりに、Angular の OnPush Change Detection 戦略を使用します。
@Component({ selector: 'app-example', template: `<div>{{ computeValue() }}</div>`, changeDetection: ChangeDetectionStrategy.OnPush, }) export class ExampleComponent { computeValue() { return 'Static Value'; } }
管理されていないサブスクリプションはメモリ リークを引き起こし、速度低下やアプリケーションのクラッシュを引き起こす可能性があります。
@Component({ selector: 'app-example', template: `<div>{{ data }}</div>`, }) export class ExampleComponent implements OnInit { data!: string; ngOnInit() { interval(1000).subscribe(() => { this.data = 'Updated Data'; }); } }
ここでは、サブスクリプションがクリアされず、メモリ リークの可能性が生じます。
常に takeUntil オペレーターまたは Angular の非同期パイプを使用して、オブザーバブルからサブスクライブを解除します。
@Component({ selector: 'app-example', template: `<div>{{ data }}</div>`, }) export class ExampleComponent implements OnDestroy { private destroy$ = new Subject<void>(); data!: string; ngOnInit() { interval(1000) .pipe(takeUntil(this.destroy$)) .subscribe(() => { this.data = 'Updated Data'; }); } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } }
または、非同期パイプを使用してサブスクリプションを自動的に管理します。
@Component({ selector: 'app-example', template: `<div>{{ computeValue() }}</div>`, }) export class ExampleComponent { computeValue() { console.log('Value recomputed!'); return Math.random(); } }
双方向バインディング ([(ngModel)]) はコンポーネントのデータと DOM の同期を保ちますが、使いすぎると過剰な変更検出が発生し、パフォーマンスに悪影響を及ぼす可能性があります。
@Component({ selector: 'app-example', template: `<div>{{ computedValue }}</div>`, }) export class ExampleComponent implements OnInit { computedValue!: number; ngOnInit() { this.computedValue = this.computeValue(); } computeValue() { console.log('Value computed once!'); return Math.random(); } }
userInput が複数の場所で使用されている場合、Angular は変更をチェックし続けます。
一方向のデータ バインディングを優先し、イベントを明示的に処理します。
@Component({ selector: 'app-example', template: `<div>{{ computeValue() }}</div>`, changeDetection: ChangeDetectionStrategy.OnPush, }) export class ExampleComponent { computeValue() { return 'Static Value'; } }
@Component({ selector: 'app-example', template: `<div>{{ data }}</div>`, }) export class ExampleComponent implements OnInit { data!: string; ngOnInit() { interval(1000).subscribe(() => { this.data = 'Updated Data'; }); } }
バンドルが大きいと、特に低速のネットワークでは読み込み時間が長くなります。
@Component({ selector: 'app-example', template: `<div>{{ data }}</div>`, }) export class ExampleComponent implements OnDestroy { private destroy$ = new Subject<void>(); data!: string; ngOnInit() { interval(1000) .pipe(takeUntil(this.destroy$)) .subscribe(() => { this.data = 'Updated Data'; }); } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } }
DOM を直接操作すると、Angular の変更検出がバイパスされ、パフォーマンスのボトルネックが発生する可能性があります。
<div>{{ data$ | async }}</div>
Angular の Renderer2 を使用して、DOM を安全かつ効率的に操作します。
<input [(ngModel)]="userInput" />
Angular の Just-in-Time (JIT) コンパイルは遅くなり、バンドル サイズが増加します。
運用環境では常に Ahead-of-Time (AOT) コンパイルを使用します。
<input [value]="userInput" (input)="onInputChange($event)" />
Angular DevTools、Lighthouse、Chrome Developer Tools などのツールを使用してボトルネックを特定します。
パフォーマンスを低下させるこれらの一般的な慣行に対処することで、Angular アプリケーションを遅くて扱いにくいものから高速で効率的なものに変えることができます。以下の手順に注意深く従えば、Angular パフォーマンスの最適化をマスターできるようになります!
以上が避けるべきAngularのパフォーマンスを阻害する主な要因 プロのように解決するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。