البداية · فصل ١

أربع بوابات مش بوابة واحدة

format · lint · test · CI
🎯 الهدف: تفرّق تنسيق الشكل عن قواعد الغلط عن الاختبار، وتعرف إن كل واحد بيمسك حاجة التاني مش شايفها.

الشكل مش هو الصح

كود من غير قواعد مشتركة بيتبعت في مراجعات شكلها “حطيت مسافة” و”شيلت سطر”. المراجعة بتضيع، والـ diff بيتوسخ، والغلطة المنطقية بتتغطى وسط ضوضاء التنسيق.

جودة الكود هنا أربع أسئلة، وكل سؤال له أداة:

شكله موحّد؟

Prettier يظبط المسافات والاقتباس والفاصلة المنقوطة. مش بيفهم البرنامج صح ولا غلط.

فيه غلطة معروفة؟

ESLint يمسك متغير مش مستخدم، أو == وأنت طالب ===. قواعد أنت كاتبها، مش ذوق.

النتيجة زي ما توقعت؟

الاختبار يشغّل حتة من الكود ويقارن الناتج بإجابة مكتوبة. لو مفيش تأكيد (assert)، الاختبار مش بيثبت حاجة.

الفحص اتعاد بره جهازك؟

الـ CI يشغّل نفس الأوامر على سيرفر بعد الـ push. الـ hook على اللابتوب ممكن يتعدى. البواب لأ.

Prettier يرتّب الورقة. ESLint يقرأها. الاختبار يحل المسألة. الـ CI يتأكد إن الحل هو اللي اتبعت.

ليه الاتنين الأولانيين منفصلين؟

لو أداة واحدة بتعمل الشكل والقواعد، كل خلاف على فاصلة منقوطة يبقى قاعدة lint، والفحص يفشل عشان ذوق. Prettier رأيه واحد ومش بيتناقش. ESLint تسيبه للقرارات اللي ليها معنى: الغلط، التحذير، والحاجة اللي لو اتصلحت أوتوماتيك ممكن تغيّر سلوك البرنامج.

الامتداد مش هو البرنامج

في Cursor و VS Code في امتداد لـ Prettier وامتداد لـ ESLint. الامتداد يرسم الخط الأحمر ويربط الاختصار وأمر الحفظ. الشغل نفسه تعمله حزمة npm متثبتة في المشروع. من غير الحزمة، الامتداد ممكن يشغّل نسخة هو جايبها، وتطلع مختلفة عن نسخة زميلك، والـ CI يرفض شكل أنت شايفه مظبوط على جهازك.

خلّصت الفصل لما

🧠 اختبر نفسك
١) Prettier هيمسك متغير متعرّف ومتستخدمش؟
لأ. ده شغل ESLint. Prettier يظبط الشكل بس.
٢) لي الامتداد لوحده مش كفاية للفريق؟
عشان ممكن يشغّل نسخة غير نسخة المشروع، فيختلف التنسيق عن اللي الـ CI هيفحصه.
٣) الـ hook على اللابتوب يغني عن الـ CI؟
لأ. الـ hook يتعدى. الـ CI يفحص النسخة اللي اتدفعت.