Vue هو إطار عمل تقدمي سريع النمو لبناء واجهات المستخدم. لقد أصبح إطار عمل JavaScript صاحب أكبر عدد من النجوم على GitHub والمشروع الأكثر نجومًا لعامي 2016 و2017 على نفس البوابة.
إنشاء التطبيقات في Vue بسيطة حقًا على هذا النحو، ولكن إذا كنت ترغب في إنشاء تطبيقات ذات جودة عالية، فأنت أمام تحدٍ أكبر قليلًا.
كونك جزءًا من The Codestالفريق والمدافع الحقيقي عن تقنية 1TP5555T، أريد مشاركة بعض الإرشادات (لم يتم نسخها من مستندات Vue الرسمية) والتي ستعمل على تحسين الكود الجودة و أداء تطبيقات Vue.
يمكنك أن تجد هناك أربع فئات من القواعد. نحن نهتم حقاً بثلاث منها:
أساسي قواعد تمنعنا من الأخطاء
موصى به و موصى به بشدة قواعد الحفاظ على أفضل الممارسات - إلى تحسين الجودة وسهولة قراءة التعليمات البرمجية.
قد تفكر... "ماذا؟ هل يجب أن أتذكر كل قاعدة؟ بالطبع ليس عليك ذلك. يمكنك استخدام ESLint للاهتمام بهذه القواعد نيابةً عنك. عليك فقط ضبط كل شيء بشكل صحيح في ملف تكوين ESLint. أقترح استخدام موصى به معدة مسبقًا حيث تحصل على مجموعة مجانية تماماً من القواعد التي تساعدك في بناء التطبيقات بممارسات جيدة. كيفية إعداده؟
بشكل افتراضي، يجب أن تجد التمديدات في تكوين ESLint واستبدال "المكوّن الإضافي:vue/الأساسي" مع "المكون الإضافي:vue/موصى به"هذا كل ما في الأمر.
بالطبع، هناك بعض القواعد التي يجب أن تتذكرها، لأن ESLint لا يمكنها التعامل مع كل شيء بمفردها. على سبيل المثال
تسمية متسقة,
تسمية الأحداث في حالة الكباب,
البادئة $_namespace_TP62T_Namespace_ الخصائص الخاصة في المكونات الإضافية والخلطات وغيرها,
ترتيب عنصر المستوى الأعلى لمكون الملف الواحد.
لا تستخدم عدة v-إذا
قد يكون من الضروري في بعض الأحيان تقديم أكثر من عنصر واحد بشكل مشروط، ولكن غالبًا ما يكتب الناس شيئًا من هذا القبيل:
ولكن ماذا لو أردنا القيام بذلك كعنصر جذر؟ في Vue، لا يمكننا استخدام <template> لهذا الغرض. في بعض الحالات، قد يكون التغليف في div كافياً.
لا بأس بذلك، ولكن، بقدر ما قد نرغب في ذلك، لا يمكننا أحيانًا التفاف العناصر في div، على سبيل المثال، بسبب دلالات html (على سبيل المثال يجب أن يكون ابنًا مباشرًا لـ
أو <ol>). لذلك عندما يتعين علينا أن نكتب
(( item.name ))
...وسنرى خطأ من هذا القبيل :
يمكننا التعامل معها من خلال باستخدام JSX ومكون وظيفي، كما يجب أن نمرر قيمة منطقية وستحل محل v-إذا.
</>
لا تكتب معالجات استدعاء واجهة برمجة التطبيقات في المكونات
في الواقع، هذا فقط أحد الأمثلة على ما لا يجب عليك فعله في المكونات. ببساطة افعل ما هو ضروري محليًا في منطق المكونات. يجب فصل كل طريقة يمكن أن تكون خارجية واستدعائها فقط في المكونات مثل منطق الأعمال.
اكتب شيئًا كهذا - فقط قم باستدعاء الأسلوب المناسب الذي سيعيد نتائج واجهة برمجة التطبيقات:
aync fetchArticles() (
حاول (
this.articles = await ArticlesService.fetchAll();
) إمساك (e) (
// معالجة الخطأ
)
)
استخدم فتحات بدلاً من كميات كبيرة من الدعائم
في بعض الأحيان يكون استخدام الدعائم كافيًا، ولكن هناك أيضًا حالات لا تكون فيها الدعائم فعالة. قد يحدث ذلك في الحالات التي نضطر فيها إلى إضافة الكثير من الخاصيات لجعل المكوّن يعمل كما نريده. أبسط مثال يمكن أن يكون مكون زر. لا شك أنه مكون يمكن استخدامه في أي مكان في التطبيق. لذا، لنفكر في مكون زر كهذا.
(( نص ))
في هذه المرحلة، إنه مكون بسيط يقبل دعامة نصية فقط. حسنًا، ولكن قد لا يكون ذلك كافيًا لأننا سنحتاج إلى أيقونات في الزر. في هذه الحالة، علينا إضافة خاصيتين أخريين (2، لأننا نريد أن يكون لدينا خيار الإضافة قبل النص أو بعده). إذًا، سيبدو المكوّن هكذا:
(( نص ))
الأمر ليس سيئاً، لدينا 3 دعائم فقط، ولكن...
ماذا لو احتجنا إلى مؤشر تحميل؟ حسنًا، سيتعين علينا إضافة دعامة أخرى. وذلك لكل ميزة جديدة! هل تبدو مواكبة نمو عدد المكونات أمرًا صعبًا الآن؟ نعم، يبدو كذلك بالتأكيد!
لنستخدم الفتحات بدلاً من ذلك.
أبسط، أليس كذلك؟ حسناً، ولكن كيف يمكننا الحصول على ميزة إضافة أيقونة؟ الأمر سهل للغاية! فقط استخدم المكوّن هكذا:
رجوع
التالي
طريقة سهلة لتحسين الأداء
سأطلعك على بعض النصائح التي يسهل تطبيقها حقًا، حتى تتمكن من الاستفادة منها على الفور.
مسارات التحميل البطيء
في بعض الأحيان قد يكون لدينا مسارات متاحة فقط للمسؤولين أو المستخدمين الذين لديهم وصول خاص، كما قد تكون زياراتهم أقل من غيرهم. إنها حالات مثالية لاستخدام مسار التحميل البطيء.
فقط استخدم دالة السهم في خاصية المكون الخاص بك لإرجاع دالة الاستيراد:
بفضل التحميل البطيء لذلك المكون، سيتم تنزيله فقط عند طلبه. على سبيل المثال، إن كان لدينا مكوّن بـ v-إذا، سيُطلب فقط في حال كان المكوّن للتصيير. لذا إن لم تكن قيمة v-إذا صحيحة، فلن يُحمَّل المكون. لهذا السبب يمكن أيضًا استخدام الاستيراد البطيء لـ JavaScript الملفات.
المكافأة: عند استخدام Vue CLI 3+، يتم التحميل المسبق لكل مورد تم تحميله بشكل كسول بشكل افتراضي!
استخدم أغلفة شفافة بدلاً من دعائم السمات
فكر في مكون مثل هذا المكون:
بدون أي مشاكل، يمكننا استخدامه على هذا النحو:
أو
إنه يعمل، لأن Vue يسمح لك بتمرير سمات html إلى المكوّن حتى لو لم تُصرّحها كخاصيّات. تُطبَّق سمات html على العنصر الجذر للمُكوِّن (الإدخال في هذه الحالة).
تظهر المشكلة عندما نريد توسيع مكوّن الإدخال الخاص بنا، حيث يمكن أن يبدو هكذا:
لن يعمل كما نريد، لأنه سيتم تطبيق النوع والعنصر النائب على div (العنصر الجذر) وهذا غير منطقي. لذا، نحن بحاجة إلى التعامل مع ذلك، لأننا نريد إضافة خصائصنا إلى عنصر الإدخال. قد تكون فكرتك الأولى هي "دعنا نضيف السمات التي نحتاجها!" وبالطبع سينجح ذلك، ولكن... ماذا لو أردنا استخدام النوع, الإكمال التلقائي, العنصر النائب, ضبط تلقائي للصورة, معطل, وضع الإدخالإلخ، إذن علينا تعريف الخاصيات لكل سمة من سمات html. أنا شخصيًا لا أحب هذه الطريقة الطويلة، لذا دعنا نبحث عن شيء أفضل!
يمكننا التعامل مع المشكلة برمتها في سطرين فقط
<template>
<div class="form-group">
<label :for="id">(( التسمية ))</label>
<!-- pay attention to v-bind="$attrs" -->
<input
:id="id"
v-bind="$attrs"
:value="value"
class="base-input"
@input="$emit('input', $event.target.value)"
>
</div>
</template>
<script>
export default (
name: 'BaseInput',
inheritAttrs: false, // <- pay attention to this line
props: ['value', 'label', 'id']
);
</script>
يمكننا استخدام v-bind="$attrs" وتمرير السمات مباشرةً إلى <input> دون الإعلان عن كميات ضخمة من الدعائم. تذكر أيضًا بشأن إضافة خيار الوراثة: خطأ لتعطيل تمرير السمات إلى العنصر الجذر. لنذهب أبعد من ذلك قليلًا: ماذا لو احتجنا إلى إضافة مستمعي الأحداث إلى هذا الإدخال؟ مرة أخرى، يمكن التعامل معها عن طريق الخاصيات أو الأحداث المخصصة، ولكن هناك حل أفضل.
هناك خاصية محسوبة جديدة تُعيد المكوّن للمستمعين وتضيف مستمع الإدخال. نستخدم ذلك الإدخال المحسوب ببساطة عن طريق كتابة v-on="مستمعون".
استخدم المراقب مع الخيار الفوري بدلاً من الخطاف والمراقب المُنشأ معًا
غالبًا ما نقوم بجلب بعض البيانات على خطاف تم إنشاؤه (أو تركيبه)، ولكننا نحتاج بعد ذلك إلى جلب تلك البيانات مع كل تغيير في خاصية ما، على سبيل المثال، الصفحة الحالية لترقيم الصفحات. يميل البعض إلى كتابتها هكذا
تصدير افتراضي (
الاسم: 'مكون ما',
مشاهدة: (
SomeWatchedProperty() (
هذا.fetchData();
)
),
تم إنشاؤها() (
هذا.fetchData();
),
الطرق: (
fetchData() (
) // التعامل مع بيانات الجلب
)
)
);
بالطبع، إنه يعمل، ولكن... إنه ليس أفضل نهج، ولا حتى نهج جيد. لذا، دعونا نتحقق من كيفية إعادة هيكلة هذا، مثال على نهج ليس سيئًا للغاية:
تصدير افتراضي (
الاسم: 'مكون ما',
مشاهدة: (
someWatchedProperty: 'fetchData'
),
تم إنشاؤه() (
هذا.fetchData();
),
الطرق: (
fetchData() (
) // التعامل مع بيانات الجلب
)
)
);
الإصدار أعلاه أفضل لأنّه ليس من الضروري وجود طريقة أخرى، لقد قمنا فقط بتسمية طريقة يجب استدعاؤها لتغيير خاصية المشاهدة.
نهج أفضل:
تصدير افتراضي (
الاسم: 'مكون ما',
مشاهدة: (
SomeWatchedProperty: (
المعالج: 'fetchData',
فوري: صحيح
)
),
الطرق: (
fetchData() (
// التعامل مع بيانات الجلب
)
)
);
تخلصنا من خطاف الإنشاء. بإضافة الخيار "فوري"، نجعل هذا المكوّن يستدعي طريقة جلب البيانات مباشرةً بعد بداية الملاحظة (أي قبل خطاف الإنشاء بقليل وبعد ما قبل الإنشاء)، لذا يمكن استخدامه بدلًا من خطاف الإنشاء.
ملخص تلميحات Vue.js
لن تجعل هذه النصائح تطبيقك مثاليًا ولكن استخدامها سيجعل تطبيقك مثاليًا بسرعة تحسين جودة التعليمات البرمجية الخاصة بك. كما آمل أن تجد في الأمثلة أعلاه ما يثير اهتمامك.