في هذا المقال سوف أتحدث عن ميزات وإمكانيات Midmare ، بالإضافة إلى مشاركة تجربتي في إنشاء مكتبتك الخاصة.
خلفية
المنتج الذي أعمل معه يخضع حاليًا لعملية ترحيل. حتى ينتهي ، نحن موجودون بالتوازي على نظامين أساسيين ونبتعد عن الإرث. أقوم بعمل واجهة خلفية لتطبيق الويب لمنصة جديدة. يجب توحيد بعض العمليات باستمرار مع فرق أخرى.
مع أخذ هذه الميزات في الاعتبار ، كان من الضروري إيجاد حل مرن وشامل لإعادة كتابة الواجهة الخلفية الحالية. كان هذا الحل مكتبة Midmare.
مهام تمهيدية
كان لدي مهمة لإنجازها بحيث يمكن استخدام المكتبة مع كل من TypeScript و JavaScript. في الوقت نفسه ، سعى الفريق إلى إعادة كتابة الكود بالكامل من TS إلى JS لتسريع عملية التطوير.
لم يتم كتابة JS ، لذلك يكون التطوير أسرع معها ، وإن كان أقل استقرارًا. كنا على استعداد لتحمل مثل هذه المخاطر حيث خططنا لحماية أنفسنا من خلال كتابة اختبارات كافية.
في البداية ، لمدة أسبوع ونصف ، فكرت في المفهوم ، مررت بخيارات مختلفة. حتى توصلت إلى فكرة أنه سيكون من الرائع استخدام نهج وظيفي بحيث يكون من الممكن إدراج أي رابط في أي سلسلة تنفيذ دون عواقب.
خطرت لي فكرة استخدام البرمجيات الوسيطة
على وجه التحديد ، لإنشاء سلسلة من وظائف المعالجة الوسيطة التي يتم تنفيذها واحدة تلو الأخرى وتتفاعل مع أخطاء بعضها البعض (أخطاء ، مشاكل ، تغييرات البيانات ، إلخ).
لذلك حصلت على مجموعة من البرامج الوسيطة ، والتي تشبه من حيث المبدأ برنامج Koa. يضمن هذا التشابه سهولة استخدام باقي المكتبة. ولكن في Midmare هناك عدد أقل من الطرق ، فقط 4. مكتبة Midmare نفسها أضيق الحدود.
بداية العمل
قبل تثبيت Midmare ، تحتاج إلى تنزيل الإصدار 10 من Node.js وتثبيته أو أعلى. عند إنشاء مشروع جديد ، تحتاج أيضًا إلى إنشاء package.json باستخدام الأمر init npm أولاً .
يتم تثبيت Midmare عن طريق الأمر npm install midmare .
يوجد أدناه نموذج لتهيئة التطبيق.
التهيئة العامة للتطبيق على Midmare باستخدام أجهزة التوجيه
(البرامج الوسيطة على مستوى جهاز التوجيه)
ميزات Midmare
أولاً وقبل كل شيء ، نحن نتحدث عن إمكانات تحليل الكود الرائعة. قد لا تعرف الدوال الوسيطة أي شيء عن بعضها البعض. إنهم يأخذون البيانات ويعالجونها ويصدرونها أكثر.
تعد مكتبة Midmare مثالية عندما تحتاج إلى استخدام نفس نظام التوجيه لواجهات برمجة تطبيقات مختلفة - المصدر والوجهة. أي عندما تحتاج إلى إنشاء عقدة معالجة مشتركة معينة. ولكن يمكنك أيضًا إنشاء تطبيقات أبسط.
فيما يلي بعض الأمثلة لتسليط الضوء على قدرات Midmare.
اصطياد الأخطاء باستخدام دالة وسيطة. إنه أيضًا مثال على تحليل الكود.وظيفة
وسيطة بسيطة تغلق جلسة HTTP في حالة عدم تطابق المسار.مثال
على معالجة أمر ، في هذه الحالة ، إرسال البيانات إلى Redis
تقوم المكتبة الصغيرة بعملها الصغير ، لكنها لا تحد من الخيارات المتاحة لك بأي شكل من الأشكال. في Midmare ، يمكنك توصيل أي شيء تقريبًا - دون الحاجة إلى التشويش على كيفية إنشاء بنية.
الميزة الرئيسية
الميزة الرئيسية لهذه المكتبة هي العزلة الكاملة عن أي طبقات (HTTP ، WS ، إلخ). إذا تم تصميم Koa لخادم HTTP ، فإن Midmare لا تضع قيودًا في هذا الصدد.
يمكنك حتى كتابة أداة طرفية. مع Midmare ، يعد هذا مناسبًا حيث يمكننا استخدام المعلمات في
path. كما في المثال أدناه:
باستخدام Midmare ، يمكنك العودة إلى نفس خادم HTTP. لن يكون من الصعب توصيله. يوجد بالفعل موجه جاهز لـ HTTP .
باستخدام هذا ، يمكنك أيضًا توصيل WebSockets بأمان. تحتاج فقط إلى تهيئة عميل WebSockets نفسه. ثم الأمر متروك لأبسط توجيه.
مثال على دمج HTTP و WebSockets مع Midmare
هذا التنوع يلغي الحاجة إلى التفكير بطرق مختلفة لحل نفس المشكلة في برنامج واحد.
في الواقع ، من الصعب سرد جميع إمكانيات التنفيذ ، لأنه بدون قيود يمكن تطبيق أي فكرة على المكتبة.
لم أر مكتبات جاهزة بهذا الشكل
أي تناظرية كاملة: بدون ارتباطات منخفضة المستوى ، سواء كانت WebSockets أو HTTP أو ، بشكل عام ، اتصالات الشبكة أو العمل البرمجي في نظام التشغيل نفسه.
يمكن أن تقوم Midmare بكل ذلك في نفس الوقت وبشكل حرفي في 5-6 أسطر ضبط.
والفكرة الكامنة وراء ذلك بسيطة للغاية - لبناء سلسلة من تنفيذ الوظائف باستخدام طريقة next / send للاتصال. إذا لم يتم استدعاء أي شيء آخر ، فسيتوقف البرنامج. بالإضافة إلى التوجيه ، ناقص HTTP - ولدينا Midmare.
لماذا تستخدم هذه المكتبة؟
يمكنك دائمًا كتابة الحل الخاص بك. بالطبع ، في هذه الحالة ، قد يكون تحللك أو الكود نفسه ضعيفًا (على سبيل المثال ، قد لا تكون قادرًا على الإسفين بين الخطوات في السلسلة). إذا كان هناك العديد من هذه العيوب ، فيمكن أن ينتهي البرنامج المكتوب باليد إلى نهاية سيئة في غضون عام أو عامين. يتجنب Midmare هذا.
إلى جانب ذلك ، هناك الكثير من المرشحات في عالم المبرمجين. شخص ما يريد الكتابة في TypeScript ، شخص ما في JS. كنت أبحث عن حل لالتقاط كلا الخيارين.
الآن أحاول اختبار Midmare وتحسينه بنشاط.
ومن المزايا الكبيرة للمكتبة الصغيرة أن منشئها يدعمها بنشاط.
أختبر مكتبتي كل يوم ، وبناءً على ذلك ، أجد بسرعة عيوبًا أو عيوبًا. مع مكتبة صغيرة ، يمكن حل أي مشكلة في أي وقت من الأوقات.
المكالمات الدورية هي أولى المشكلات التي تم حلها
لنلقِ نظرة على المثال أدناه:
لنفترض أننا بحاجة إلى إضافة استدعاء "/ send" إلى خطوة .process ('/ message') ، لكن تحتوي .process ('/ send') بالفعل على مكالمة '/ message' ثم الخطوة رقم 2 سوف تستدعي الخطوة رقم 1. في هذه الحالة ، في الخطوة رقم 1 ، سيتم تشغيل الاستدعاء للخطوة رقم 2 في كل مرة - وهكذا في دائرة.
عندما تعمل على إنشاء مكتبة ، فأنت بحاجة إلى التعرف على مثل هذه المشكلات ، وعرضها على المستخدمين ، وشرح ما هي محفوفة بالمخاطر.
في هذه الحالة ، سوف نحصل على خطأ تجاوز الحد الأقصى لحجم مكدس الاستدعاءات وستتعطل JS استجابةً لاستدعاءات متكررة متعددة لنفس الوظيفة.
الحل لهذه المشكلة في هذه المكتبة هو: الاحتفاظ بمحفوظات المسار في سياق واحد. أي أن كل استدعاء لـ "ctx.send" أو "app.send" له سجل مكالماته الخاص.
نظرًا لأن Midmare لديه مؤشر على هذه النقطة ، فإن المكتبة ستلقي بخطأ إذا تم استدعاؤها في حلقة.
قد تكون هناك حالة تتطلب مكالمة دائرية. على سبيل المثال ، هناك وظيفتان وسيطتان تتعاملان مع نفس البيانات بشكل مختلف لأن هناك احتمالية لكسر الحلقة. أي عندما تحتوي إحدى الوظائف على if-else ، والتي ستعمل في الآخر وتتجاهل المكالمة الدورية.
في حالة تطلب التنفيذ ركوب الدراجات ، فإن لدى Midmare خيارًا لتعيين الخطأ للتجاهل عبر ʻignoreCycleError: true`.
المكتبة تنتظر مجتمعها
من حيث المبدأ ، ليس من المنطقي إضافة أي شيء إلى مثل هذه المكتبة النقية. سيكون من الجيد إضافة القدرة على توصيل المكونات الإضافية ، ولكن باستخدام البرامج الوسيطة يمكن حل ذلك بدون وظائف جديدة.
في حالة فقدان بعض المعالجة في حالة معينة ، يمكنك إضافتها بنفسك إلى 4 أسطر شرطية. كما في المثال الخاص بوظيفة إغلاق جلسة HTTP:
يمكن نقل كل عمليات المعالجة الإضافية إلى مستودع تخزين منفصل. أو لتوزيع أجهزة التوجيه على المستودعات. سيتم توصيل كل شيء ومعالجته بنفس الطريقة.
ما ستفعله المكتبة جيدًا في الوقت الحالي هو مجتمع يبني أدواته الخاصة من المكتبة. لذلك أدعو المجتمع للمساهمة في تطوير المكتبة. انضم واختبر.
مؤلف:إيفان بيتوشينسكي ، كبير مطوري Node.js