أوقف التبعيات الدائرية باستخدام SDP
التبعيات الدائرية هي قاتل صامت. فهي لا تسبب أخطاء في عملية البناء (build errors)، ولا تسبب استثناءات وقت التشغيل (runtime exceptions) عند الاستيراد. بدلاً من ذلك، تتسبب في ظهور قيم غير محددة (undefined values) بشكل خفي تظهر في بيئة الإنتاج بعد أسابيع.
تحدث الدورة عندما يقوم Module A باستيراد شيء من B، ويقوم B باستيراد شيء من A.
يقوم JavaScript بحل هذه الاستيرادات بصمت. إذا كان Module A لا يزال قيد التحميل عندما يطلبه Module B، فإن JavaScript يعيد كائناً فارغاً (empty object). يفشل الكود الخاص بك لاحقاً، ويشير تتبع المكدس (stack trace) إلى المكان الخاطئ.
يمكنك إصلاح ذلك باستخدام dependency-cruiser. تقوم هذه الأداة بفحص ملفاتك ورسم مخطط لبيانات التبعية (dependency graph) الخاصة بك. وهي تعمل مع TypeScript والمستودعات المتعددة (monorepos).
كيفية الإعداد:
- أضفه إلى تبعيات التطوير (dev dependencies):
yarn add -D dependency-cruiser - أضف سكربت إلى
package.json:"depcruise": "depcruise packages --config .dependency-cruiser.js" - أنشئ ملف
.dependency-cruiser.jsلاكتشاف الدورات.
لكن العثور على دورة ليس سوى نصف المعركة. يجب عليك منع تكوينها.
استخدم مبدأ التبعيات المستقرة (Stable Dependencies Principle - SDP). تنص هذه القاعدة على أنه يجب عليك الاعتماد في اتجاه الاستقرار.
الاستقرار هو خاصية هيكلية. يكون الموديول مستقراً عندما تعتمد عليه العديد من الموديولات الأخرى. إذا قمت بتغيير موديول مستقر، فستؤثر على الكثير من الأشخاص. هذه التكلفة هي ما تجعله مستقراً.
استخدم معادلة عدم الاستقرار (Instability formula):
I = Fan-Out / (Fan-In + Fan-Out)
• I = 0 تعني أن الموديول مستقر لأقصى درجة. كل شيء يعتمد عليه، وهو لا يعتمد على شيء.
• I = 1 تعني أن الموديول غير مستقر لأقصى درجة. هو يعتمد على أشياء كثيرة، ولا شيء يعتمد عليه.
القاعدة: يجب أن تكون درجة عدم استقرار الموديول أعلى من درجة كل موديول يقوم باستيراده. يجب أن تشير أسهمك نحو عدم استقرار أقل.
لا ينبغي أبداً لملفات الـ utils ذات المستوى المنخفض (I ≈ 0) أن تستورد من صفحات الـ pages ذات المستوى العالي (I ≈ 1).
يمكنك تحويل هذا المبدأ إلى قاعدة مؤتمتة باستخدام dependency-cruiser. بدلاً من مجرد التحقق من الدورات، تحقق من الاتجاه:
- منع الـ
utilsمن الاستيراد من الـfeatures. - منع الـ
featuresمن الاستيراد من الـpages.
هذا يوقف الظروف الهيكلية التي تخلق الدورات. ستتوقف عن مجرد الاستجابة للأخطاء وتبدأ في منعها.
