محتويات الدورة

Angular / المتقدم / الدرس 14

أداء العرض وOnPush

قِس اختناق العرض الفعلي واستخدم هويات تفاعلية ثابتة وافهم OnPush دون اعتباره عرضًا لمرة واحدة.

وقت القراءة التقريبي: 3 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • شرح محفزات تحديث عرض OnPush.
  • فصل الحساب وDOM وكلفة الشبكة.
  • فحص التحسين مع حفظ سلوك المستخدم.

تحديد العمل المكلف فعلًا

قد يبطؤ الحساب والفحص والتخطيط والصور والشبكة والحالة المحتفظة. قِس تفاعلًا ممثلًا واحفظ نتيجته قبل تغيير الكشف. لا يقيس حساب إشارة تخطيط المتصفح أو زمن الإدخال. استخدم تنميطًا مناسبًا وشروطًا ممثلة دون تعميم مدة. سجّل الحجم والجهاز والبناء والإجراء؛ يفيد التحسين إن قلل العمل المقصود مع صحة وإتاحة.

إظهار التحديث للرسم التفاعلي

يشتق النموذج مجموع مصفوفة ويستبدلها عند الإضافة، فيقرأ ثلاثة ثم ستة. يفحص الاشتقاق لا سرعة القائمة. قد يترك التعديل الموضعي المشتق محفوظًا لتساوي المرجع. لا تخف العيب بنقرة أخرى أو كشف يدوي؛ صحح التحديث ليتلقى الجميع حالة متماسكة دون حدث مصادف.

typescript فحص تحديث تفاعلي مكتمل بالاستبدال
import { computed, signal } from "@angular/core";
const values = signal<readonly number[]>([1, 2]);
const total = computed(() => values().reduce((sum, value) => sum + value, 0));
console.log(total());
values.update(current => [...current, 3]);
console.log(total());
الناتج المتوقع
3
6

المجموعان ثلاثة وستة دون ادعاء زمن قياس أو عرض متصفح.

تستجيب OnPush للإشعارات المدعومة

يستخدم المكوّن OnPush ومدخل إشارة. قد تحفز المدخلات والأحداث والإشعارات الفحص؛ فلا تعني مرة واحدة. يهم المرجع الجديد غالبًا وتتبع قراءة القالب الإشارة. يتبع التحديث إعداد الكشف المدعوم ولا تفترض جدولة رد خارجي غير مرصود. يحتاج المقطع مضيف rows واختبارًا فعليًا للتغير.

typescript مكوّن OnPush سياقي بمدخل متتبع
import { ChangeDetectionStrategy, Component, input } from "@angular/core";
@Component({
  selector: "app-count-view", standalone: true,
  changeDetection: ChangeDetectionStrategy.OnPush,
  template: `<p>Rows: {{ rows().length }}</p>`
})
export class CountView { readonly rows = input.required<readonly { id: number }[]>(); }

يعرض المضيف ذو صفين Rows: 2، ويحتاج التحديث تغيير المضيف ومزامنة العرض ولم ينفذ هنا.

تقليل العمل قبل التحكم اليدوي بالكشف

انقل التحويل الخالص لاشتقاق محفوظ وتجنب تخصيص القالب وثبّت المفاتيح وحد العرض إذا جاز. تعالج الافتراضية والتأجيل وحدود المسارات أحمالًا مختلفة بعقودها. قد يفيد ChangeDetectorRef عند حد دمج مقصود وتخفي دعواته المتناثرة ملكية أو إشعارًا مفقودًا. لا تعطل الفحص لقياس أسرع، ولا تخسر التركيز والإعلان والاختيار لتقليل العمل. اختبر المهمة نفسها قبل وبعد.

جمع القياس وتوقعات منع العودة

اختبر الناتج والتفاعل والحالات واللوحة والتنظيف قبل قبول السرعة. يبين تتبع المتصفح العمل ويحمي الاختبار الحساب ولا يستبدلان بعضهما. افصل البارد والدافئ ولا تقس تطويرًا كإنتاج. وثّق الحجم والتكرار. لإعداد Zone واللاZone تفاصيل إصدار؛ فلا تعد بترحيل بحذف حزمة فقط. اتبع التوثيق وافحص الإشعارات بتجربة مكتملة.

الأخطاء الشائعة وإصلاحها

وصف OnPush بعدم الفحص مجددًا.

لماذا يحدث؟
خُلط تخطي غير المتأثر بعرض وحيد.
كيف تصلحه؟
نمذج الإشعارات المدعومة واختبرها.
كيف تتجنب تكراره؟
افحص المدخل والحدث والإشارة منفصلة.

تخفي دعوات الكشف تعديل الحالة الموضعي.

لماذا يحدث؟
عومل التحديث المفقود كمسألة سرعة.
كيف تصلحه؟
أصلح الاستبدال والملكية أولًا.
كيف تتجنب تكراره؟
اختبر المشتق دون أحداث بعيدة.

عرض أسرع يفقد التركيز بتحديث القائمة.

لماذا يحدث؟
قيس الأداء دون عقد التفاعل.
كيف تصلحه؟
احفظ الهوية والتركيز.
كيف تتجنب تكراره؟
أرفق الأداء بفحوص الإتاحة.

اختبر فهمك

1. ألحق صفرًا بدل ثلاثة. ما المجموع ولماذا لا يعني ثباته فشل المصدر؟

اعرض الحل المشروح

يبقى المجموع ثلاثة وتزيد المصفوفة عنصرًا. يمثل المصدر والمجموع حقيقتين؛ فقد يتغير أحدهما ويثبت مشتق. اختبر الطول والمجموع؛ يتغير عد الصفوف لثلاثة ويصح ثبات عرض الجمع.

2. يقترح مطور OnPush لصفحة يهيمن عليها رد شبكة بطيء. ما الدليل قبل ادعاء الإصلاح؟

اعرض الحل المشروح

افصل التأخر والحساب والعرض بالقياس. قد تقلل OnPush فحصًا ولا تسرع وصول الخادم. احفظ الحالات والإتاحة وقِس العميل وانسب التحسن الفعلي لا كل الزمن للكشف دون دليل.

أهم ما تعلمته

  • حسّن المقاس مع حفظ السلوك.
  • لـOnPush محفزات لا وعد عرض وحيد.
  • تبقى الهوية والإتاحة متطلبي صحة.

المراجع الرسمية