Vue / المتقدم: المعمارية والاستيعاب ودليل الإنتاج / الدرس 14
الأداء وكلفة العرض والتحسين المقاس
حدد الاختناق الذي يراه المستخدم قبل تغيير التفاعلية أو تحميل الشيفرة أو القائمة.
في هذه الصفحة
أهداف الدرس
- افصل كلفة البدء والتحديث والتخطيط ومعالجة البيانات.
- استخدم مدخلات ثابتة وعرضاً محدوداً دون إخفاء تغير الحالة.
حدد تفاعلاً قابلاً للتكرار
تحتاج البداية البطيئة والبحث والتمرير والذاكرة أدلة مختلفة. حدد المهمة والبيانات والجهاز والبناء والقياس. تفيد أدوات التطوير وقد تشوه التوقيت فقارن المتكافئ القريب من الإصدار. قس قبل المخبأ والسطحية واحفظ الصحة والوصول والخطأ. لا تشغل الدورة خادماً أو قياس متصفح أو حملاً؛ تشرح التصميم وتفحص الحساب المحلي فقط.
تجنب تعديل المصدر غير اللازم أثناء الاشتقاق
ضع الاشتقاق المكلف خارج التعبير المتكرر وراجع خوارزميته وتعديله. يرتب المثال نسخة اصطناعية ويثبت بقاء الأصل؛ هو صحة لا قياس أو إثبات الاختناق. تخزن computed وفق الاعتماد ولا تجعل المكلف مجانياً. لا ترتب الأصل المشترك عرضياً داخل getter وراجع الهوية والحاجة قبل طبقة مخبأ جديدة.
const notes = [{ id: "n2", title: "Zebra" }, { id: "n1", title: "Alpha" }]
const sorted = [...notes].sort((a, b) => a.title.localeCompare(b.title))
if (sorted[0].id !== "n1" || notes[0].id !== "n2") {
throw new Error("SORT_OWNERSHIP_MISMATCH")
}
يعمل مستقلاً بـ Node؛ تبدأ النسخة بـ n1 ويبقى الأصل n2. يحتاج الترتيب اللغوي سياسة خاصة ويثبت المثال ملكية البيانات البسيطة فقط.
قلل العمل عند الحد المتغير فعلياً
تقلل الخصائص الثابتة تحديث الأبناء عند تغير عنصر واحد. مرر المطلوب المحدد لا كائناً واسعاً متغيراً لكل ابن. تحفظ المفاتيح الهوية ولا تجعل كل عرض رخيصاً. قد تحتاج الضخمة عرضاً افتراضياً مع فحص التركيز والوصول. v-once وv-memo متخصصان وقد ينتجان قدماً باعتماد خاطئ؛ استخدمهما بعد القياس ومراجعة الصحة.
حمّل مكوّناً اختيارياً ثقيلاً عند الحاجة
يقلل تقسيم الشيفرة البدء للميزة الاختيارية. تغلف defineAsyncComponent المحمّل وقد ينتج المجمّع جزءاً منفصلاً. يعرض المثال اللوحة بعد فعل المستخدم ولا يقلل تلقائياً البيانات أو كلفتها بعد التحميل. وفر انتظاراً وخطأ، ولتأجيل مكوّن المسار نمطه فلا تغلف كل مسار بهذه الدالة. ضمّن فشل الجزء والنقل بالعقد.
<script setup>
import { ref, defineAsyncComponent } from "vue"
const showDetails = ref(false)
const NoteAnalytics = defineAsyncComponent(() => import("./NoteAnalytics.vue"))
</script>
<template>
<button type="button" @click="showDetails = true">Show note details</button>
<NoteAnalytics v-if="showDetails" />
</template>
يتطلب المكوّن والمجمّع. يتحكم الشرط بأول عرض وطلب المحمّل، ولم ينفذ بناء أو تنزيل أو قياس متصفح.
اجعل وعود التحسين صادقة
تقلل shallowRef التحويل العميق للكبير الثابت أو الخارجي لكن لا تحفز التعديلات الداخلية كالعميقة. استبدل الخارج أو حفز صراحة بتبرير. تؤثر markRaw والمخارج في الهوية فلا تجعلها إصلاحاً عاماً. افحص الصور والتخطيط والنقل وJavaScript؛ قد تبطؤ الإطارات مع تحديث قليل. أعد المهمة بعد تغيير مركز واحفظ الدليل؛ لا يقبل أسرع يفقد التحديث أو اللوحة.
الأخطاء الشائعة وإصلاحها
يغير ترتيب محسوب القائمة المشتركة
- لماذا يحدث؟
- استخدم تعديل المصفوفة بالاشتقاق.
- كيف تصلحه؟
- اشتق من نسخة أو طريقة لا تعدل.
- كيف تتجنب تكراره؟
- اختبر هوية الأصل وترتيبه.
يعرض صف مخبأ محتوى قديماً
- لماذا يحدث؟
- يغيب اعتماد مؤثر بالعرض.
- كيف تصلحه؟
- أعد الاعتماد الكامل أو أزل التحسين المبكر.
- كيف تتجنب تكراره؟
- اقرن الأداء بحالات صحة.
تعدل بنية سطحية داخلياً دون تحديث
- لماذا يحدث؟
- افترض العمق لواجهة سطحية.
- كيف تصلحه؟
- اتبع الاستبدال الثابت أو التحفيز الصريح.
- كيف تتجنب تكراره؟
- وثق السطحية لكل مستهلك.
اختبر فهمك
1. تبقى القائمة بطيئة مع تحديثات قليلة. ماذا يفحص؟
اعرض الحل المشروح
افحص التخطيط والرسم والصور وJavaScript والذاكرة والتحميل بتتبع ممثل. العدد إشارة لا كلفة الإطار كلها؛ حسّن المسيطر وأعد المهمة.
2. هل يغلف كل مكوّن مسار بـ defineAsyncComponent؟
اعرض الحل المشروح
لا؛ يوثق الموجه استيراد المسار الديناميكي بتكامله. استخدم واجهة الحد وافحص الانتظار والخطأ والتنقل والبناء لا غلافاً عاماً.
أهم ما تعلمته
- قس المهمة قبل التحسين.
- تحتاج المدخلات والعرض المحدود عقوداً صادقة.
- يعالج التقسيم والتفاعلية والعرض كلفاً مختلفة.