Express ، Koa ، Meteor ، Sails.js: أربعة أطر لنهاية العالم

نشرت: 2022-03-11

أصبحت JavaScript بالتأكيد واحدة من أكثر اللغات شيوعًا في السنوات الأخيرة ، نظرًا للطلب الهائل على تطبيقات الويب. أثناء الترميز لمتصفحات متعددة ، يعد JavaScript هو الخيار الوحيد تقريبًا لمطوري الواجهة الأمامية. قد يجادل المرء بأن هناك CoffeeScript أو TypeScript أو Dart كبدائل. ومع ذلك ، فإن الحقيقة هي أن CoffeeScript يُنظر إليه في الغالب على أنه سكر نحوي يتلخص في النهاية في JavaScript. TypeScript هو ببساطة مجموعة شاملة من JavaScript تتضمن العديد من ميزات اللغة الموجهة للكائنات ، مثل الكتابة الثابتة الاختيارية والفئات والواجهات ، ولا تزال في بدايتها. Dart هي أيضًا لغة موجهة للكائنات لها بناء جملة يشبه C ، لكنها لا تزال تترجم إلى JavaScript للمتصفحات السائدة.

مع ولادة Node.js ونموها السريع ، لم تعد JavaScript مقتصرة على تطوير الواجهة الأمامية بعد الآن ، ولم يعد تطوير الواجهة الخلفية علمًا صارخًا لمبرمجي الواجهة الأمامية. يميل الناس إلى التفكير في JavaScript على أنها رصاصة فضية تناسب جميع المواقف: الواجهة الأمامية ، وخادم الويب ، وتطبيقات سطح المكتب ، والنظام المضمن ، وقواعد البيانات ... القائمة تزداد طولًا. في الواقع ، نظرًا للجماهير الواسعة لجافا سكريبت ، نجحت Node.js + MongoDB + AngularJS / React في تكوين عدد كبير جدًا من مطوري الويب المكدس. ومع ذلك ، تم تصميم Node.js ليكون خفيف الوزن ويوفر وظائف أساسية فقط كخادم ويب لتعزيز سرعة تطوير تطبيقات الويب. سيكون أحد أطر العمل الجيدة المتوفرة كحزم npm خيارًا أفضل في العالم الحقيقي.

في هذا المنشور ، سنستعرض بعض أطر عمل Node.js المعروفة والمُختبرة بالوقت والتي أعفت المطورين من الاضطرار إلى إعادة اختراع العجلة مرارًا وتكرارًا. لنكون أكثر تحديدًا ، في هذه المقالة سنلقي نظرة على Express و Koa و Meteor و Sails.js. بدلاً من محاولة معرفة كيفية تكديس كل إطار من هذه الأطر مقابل بعضها البعض ، سنرى المجالات الرئيسية التي يتفوق فيها كل إطار من هذه الأطر ومدى ارتباطها باحتياجات المشروع المختلفة.

Express: إطار ويب مبسط

وغني عن القول أن Express هو أكبر صفقة لأعمال Node.js. كل لاعب في Node.js قد سمع به ويستخدمه مع أو بدون ملاحظة. إنه حاليًا في الجيل الرابع ، وهناك عدد غير قليل من أطر عمل Node.js المبنية عليها أو مستوحاة من مفاهيمها.

أداء

يعشق معظم المطورين Node.js بسبب سرعته الأولية ، وعندما يتعلق الأمر باختيار إطار العمل ، قد يتجاهل الشخص المثالي أي خطر في الأداء. يوفر Express طبقة رقيقة أعلى Node.js مع ميزات تطبيق الويب مثل التوجيه الأساسي والبرمجيات الوسيطة ومحرك القالب وخدمة الملفات الثابتة ، لذلك لا يتم اختراق أداء الإدخال / الإخراج الجذري لـ Node.js.

Express هو إطار عمل بسيط وغير مبني على رأي. لا يطبق أيًا من أنماط التصميم السائدة مثل MVC أو MVP أو MVVM أو أي شيء يتجه خارج الصندوق. لمحبي البساطة ، تعد هذه ميزة كبيرة بين جميع الأطر الأخرى لأنه يمكنك إنشاء التطبيق الخاص بك بتفضيلاتك الخاصة وبدون منحنى تعليمي غير ضروري. يكون هذا مفيدًا بشكل خاص عند إنشاء مشروع شخصي جديد بدون عبء تاريخي ، ولكن مع نمو المشروع أو تطوير الفريق ، قد يؤدي الافتقار إلى التوحيد القياسي إلى عمل إضافي لإدارة المشروع / الكود ، وقد يؤدي أسوأ سيناريو إلى عدم القدرة على الحفاظ .

مولد كهرباء

على الرغم من أن إطار العمل غير مرئي ، إلا أنه يحتوي على المولد الذي ينشئ بنية مجلد مشروع محددة. بعد تثبيت حزمة npm للمولد السريع وإنشاء هيكل تطبيق باستخدام أمر المولد ، سيتم إنشاء مجلد تطبيق به تسلسل هرمي واضح لمساعدتك في تنظيم الصور وجافا سكريبت للواجهة الأمامية وملفات ورقة الأنماط وملفات قوالب HTML.

 npm install express-generator -g express helloapp
 create : helloapp create : helloapp/package.json create : helloapp/app.js create : helloapp/public create : helloapp/public/images create : helloapp/routes create : helloapp/routes/index.js create : helloapp/routes/users.js create : helloapp/public/stylesheets create : helloapp/public/stylesheets/style.css create : helloapp/views create : helloapp/views/index.jade create : helloapp/views/layout.jade create : helloapp/views/error.jade create : helloapp/bin create : helloapp/bin/www install dependencies: $ cd helloapp && npm install run the app: $ DEBUG=helloapp:* npm start create : helloapp/public/javascripts

الوسيطة

البرامج الوسيطة هي في الأساس مجرد وظائف لها وصول كامل إلى كائنات الطلب والاستجابة.

طلب معالجة مكدس

كما يوحي الاسم ، تطبق البرامج الوسيطة بعض تعليمات التصفية قبل تسليم التحكم إلى منطق العمل الفعلي أو المستوى التالي من البرامج الوسيطة. تتضمن بعض المهام الشائعة ، مثل التحقق من حالة تسجيل دخول المستخدم ، أو التحقق من سلطة المستخدم ، أو منع الهجمات عبر المواقع ، من الأفضل استخراجها كبرامج وسيطة.

 var app = express(); app.use(cookieParser()); app.use(bodyParser()); app.use(logger()); app.use(authentication()); app.get('/', function (req, res) { // ... }); app.listen(3000);

يعد تطبيق Express في الأساس Node.js مع مجموعة من وظائف البرامج الوسيطة ، سواء كنت ترغب في تخصيص البرامج الوسيطة الخاصة بك أو الاستفادة من البرامج الوسيطة المضمنة في إطار العمل ، فقد جعل Express العملية طبيعية وبديهية.

محرك النموذج

تسمح محركات القوالب للمطور بتضمين متغيرات الواجهة الخلفية في ملفات HTML ، وعند الطلب سيتم عرض ملف القالب بتنسيق HTML عادي مع متغيرات محرف مع قيمها الفعلية. بشكل افتراضي ، يستخدم المولد السريع محرك قالب Pug (المعروف في الأصل باسم Jade) ، لكن الخيارات الأخرى مثل Moustache و EJS تعمل أيضًا مع Express بسلاسة.

تكامل قاعدة البيانات

كإطار عمل ضئيل ، لا يعتبر Express تكامل قاعدة البيانات جانبًا مطلوبًا داخل الحزمة الخاصة به ، وبالتالي فهو لا يميل إلى أي استخدام محدد لقاعدة البيانات على الإطلاق. أثناء اعتماد تقنية تخزين بيانات معينة ، سواء كانت MySQL أو MongoDB أو PostgreSQL أو Redis أو ElasticSearch أو أي شيء آخر ، فإن الأمر يتعلق فقط بتثبيت حزمة npm معينة كمشغل قاعدة بيانات. لا تتوافق برامج تشغيل قواعد البيانات التابعة لجهات خارجية مع البنية الموحدة عند تنفيذ تعليمات CRUD ، مما يجعل تبديل قواعد البيانات مشكلة كبيرة وعرضة للخطأ.

Koa: الاستفادة من ميزات الجيل التالي من JavaScript

تم تطوير Koa بواسطة الفريق الذي يقف وراء Express ، وهدفه هو تقليل الحد الأدنى من Express Express عن طريق عدم تجميع أي برمجيات وسيطة في جوهره. بخلاف كونه لا يحتوي على برمجيات وسيطة ، يبدو Koa مشابهًا جدًا لـ Express وخفيف الوزن وغير عابر للرأي. ومع ذلك ، فإن ما يجعل Koa متميزًا حقًا هو طريقه للتخلي عن رد الاتصال تمامًا باستخدام ميزة ES6 Generator.

تدفق تحكم أنيق

Javascript هي لغة برمجة غير متزامنة ، ومع غريزة اللغة نفسها وآلية Node.js التي تحركها الأحداث المترابطة ، فإن رد الاتصال موجود في كل مكان ، ومن ثم جحيم رد الاتصال سيئ السمعة.

تتمثل إحدى طرق تسطيح تداخل رد الاتصال في استخدام Async.js. يوفر Async.js تقنيات لتعيين وظائف متعددة أو موازنتها أو تسلسلها أو تكرارها دون الحاجة إلى تضمين واحدة في أخرى ثم تمرير تدفق التحكم باستخدام وظيفة رد الاتصال ، تكفي وظيفة رد اتصال واحدة ووظيفة معالجة خطأ واحدة لمجموعة الوظائف المجمعة معًا بطريقة Async.js. ومع ذلك ، لا يمكن لـ Async.js مسح عمليات الاسترجاعات بالكامل. عند كتابة كود Node.js باستخدام Async.js ، لا تزال المسافة البادئة للكود تميل إلى الانحراف إلى اليمين ، ولكن ليس بنفس العمق.

الهروب من الجحيم رد الاتصال

هناك طريقة أخرى أنظف وهي استخدام الوعود الممكنة آنذاك. بعض مكتبات الأطراف الثالثة التي تتمتع بسمعة طيبة هي Bluebird و q. في أحدث إصدار من JavaScript ، ES6 ، تم اعتماد Promise كتوحيد قياسي. قصة قصيرة طويلة ، يضمن Promise تنفيذ الوظائف وإعادتها بطريقة تسلسلية من خلال ربط كتل / وظائف التنفيذ بمجموعة من وظائف Promise "then". إما أن تقوم "بحل" في نهاية كل كتلة / وظيفة تنفيذ بحيث يتم تنفيذ وظيفة "ثم" التالية ، أو "ترفض" التنفيذ التالي بحيث يقفز تدفق التحكم مباشرة لمعالجة الأخطاء. بهذه الطريقة ، تقوم بتجميع جميع وظائف معالجة الأخطاء في مكان واحد والتخلص من عمليات الاسترجاعات تمامًا.

الآن ES6 يجلب مغير اللعبة إلى الطاولة - ES6 Generator. هذه الفكرة جديدة على JavaScript ، ولكنها ليست جديدة في عالم البرمجة على الإطلاق. ES6 Generator يشبه الانقطاع في C ، بدلاً من تشغيل أسطر التعليمات البرمجية على طول الطريق من أعلى إلى أسفل ، يقدم ES6 Generator وسيلة لتشغيل-> إيقاف وتشغيل شيء آخر-> العودة لإنهاء ما تبقى.

يستخدم Koa مولدات ES6 لتوفير طريقة أنيقة للتعامل مع برمجة JavaScript غير المتزامنة ، وبالتالي لا يمكنك رؤية عمليات الاسترجاعات في تطبيق Koa الخالص. إحدى حالات الاستخدام النموذجية لـ ES6 Generator في Koa هي تعاقب البرامج الوسيطة ، والذي يسمح للبرامج الوسيطة المخصصة بتنفيذ واحد تلو الآخر دون أي عمليات رد نداء سيئة.

 var app = koa(); function* responseTimeLogger(next){ var start = new Date; yield next; var ms = new Date - start; console.log(this.method + ' ' + this.url + ': ' + ms); } app.use(responseTimeLogger); // ... app.listen(3000);

لا يمكننا القفز إلى استنتاجات تؤكد أن هذه التقنية المتطورة تتفوق على حلول المدرسة القديمة مثل Async.js أو Promise أو باعث الأحداث ، ولكن هناك شيء واحد مؤكد أن هذا المفهوم الجديد يستغرق بعض الوقت للتعود عليه. مع تسلسل تدفق التحكم غير التقليدي ، يمكن أن يؤدي إلى صعوبة إضافية في تصحيح أخطاء الكود.

نيزك: إطار عمل الويب والجوال وسطح المكتب

Meteor هو إطار عمل JavaScript شامل. بالتمييز عن فلسفة التبسيط Express و Koa ، فإنها تذهب إلى أقصى الحدود من خلال تعريف نفسها على أنها إطار عمل متكامل ، حزمة كاملة تغطي تطبيقات الخادم والجوال وسطح المكتب والويب.

حزمة واحدة للجميع

إذا نظرت عن كثب تحت الغطاء ، ستلاحظ أن Meteor هو بالفعل Node.js + Blaze / AngularJS / React + Cordova + MongoDB. Node.js و MongoDB مسؤولان على التوالي عن منطق الأعمال من جانب الخادم وتخزين البيانات. يعتني أحد Blaze أو AngularJS أو React بواجهة المستخدم الأمامية. وكوردوفا ، باعتباره أشهر حل HTML للتطبيقات الهجينة للأجهزة المحمولة ، يربط صفحات الويب بعروض الهاتف المحمول.

تزامن البيانات

تكون العملية السائدة للخلفية والواجهة الأمامية لمشاركة البيانات كما يلي:

  • يطلب العميل بيانات أو عرض HTML معين
  • يسترد الخادم البيانات من قاعدة البيانات ، ويمزج البيانات مع عرض HTML باستخدام بعض محركات القوالب ويرسلها مرة أخرى إلى الواجهة الأمامية
  • يقوم العميل بتقديم وعرض البيانات / العرض بطريقة سهلة الاستخدام

يقوم تطبيق ويب حديث من صفحة واحدة بتعديل العملية المذكورة أعلاه قليلاً. خذ AngularJS كمثال ، فهي تضع قوالب HTML كملفات ثابتة مع أصول أخرى مثل ملفات JavaScript للواجهة الأمامية وأوراق الأنماط والصور. تقوم AngularJS بعد ذلك بملء البيانات في قوالب HTML عن طريق مطالبة النهاية الخلفية للبيانات باستخدام Ajax RESTful API. في كلتا الحالتين ، يتحمل مطورو الواجهة الخلفية المسؤولية الكاملة عن معالجة طلبات تغيير البيانات من الواجهة الأمامية وحفظ التغييرات في قاعدة البيانات.

يتم تنفيذ مزامنة البيانات ثنائية الاتجاه تلقائيًا

تتمثل إحدى الميزات التي تميز Meteor عن الأطر الأخرى في آلية مزامنة البيانات بين الخادم وتطبيقات الواجهة الأمامية / الأجهزة المحمولة. في Meteor ، يحتفظ العميل بنسخة احتياطية لقاعدة بيانات مصغرة وهي جزء صغير من النسخ المتماثل من قاعدة بيانات الخادم ، وهو جزء كان يطلبه العميل مسبقًا ومصرح به من قبل الخادم. عندما يريد العميل إجراء أي تغييرات على البيانات ، فإنه يستخدم واجهة برمجة تطبيقات قاعدة البيانات المتسقة كجانب خادم لتنفيذ أي تعليمات CRUD ، ثم يتم إرسال تغييرات البيانات تلقائيًا إلى الخادم وحفظها في قاعدة البيانات الفعلية. عندما يكتشف الخادم أي تعديلات على البيانات ، فإنه يدفع البيانات المحدثة إلى عملاء محددين يشتركون في تلك البيانات. تتم مزامنة البيانات ثنائية الاتجاه تلقائيًا دون أي تدخل يدوي. من أجل إنشاء هذا السحر ، يستخدم Meteor WebSocket لتوصيل العميل والخادم تحت غطاء المحرك بحيث تنعكس أي تغييرات في البيانات على طرف آخر على الفور.

أداة البناء الآلي

لا تهتم Meteor فقط بتطبيقات الخادم وتطبيقات الويب ، باستخدام أداة بناء Meteor المسماة Isobuild بمساعدة Cordova ، وهي مكتبة تجمع HTML / JavaScript / CSS بوظائف الهاتف المحمول الأصلية ، تجعل Meteor إنشاء تطبيقات iOS و Android أمرًا سهلاً. تطبيقات الأجهزة المحمولة التي تم إنشاؤها هي تطبيقات مختلطة تعمل على تشغيل JavaScript أو تعرض صفحات HTML داخل WebView. قد يؤثر هذا الحل البديل على بعض تجربة المستخدم عند مقارنتها بتطبيقات الأجهزة المحمولة الأصلية ، ولكن بالنسبة للكثيرين ، فإن القدرة على إدارتها كلها ضمن نفس قاعدة التعليمات البرمجية مع تطبيقات الويب تعد نقطة بيع كبيرة ، وتوفر الكثير من تكلفة التطوير.

بشكل عام ، يعد Meteor إطارًا آليًا للغاية. تجعل هذه الأتمتة عالية المستوى حياة المطورين أسهل بكثير ، لكنها تأتي مع تكلفة الأداء المحفوف بالمخاطر وقيود التوسع. مع نمو قاعدة المستخدمين ، تصبح تقنية مزامنة البيانات الآلية هي نقطة الاختناق للقياس. لتحقيق نفس السعة والأداء مثل تقنيات الواجهة الخلفية الأخرى المضبوطة يدويًا ، تستهلك Meteor عادةً الكثير من أجهزة الخادم وموارد النطاق الترددي. لذلك يمكن أن يكون Meteor نقطة بداية رائعة وصندوق أدوات مثاليًا إذا أراد المرء أن يصمم نموذجًا أوليًا لمشروع لجميع المنصات الرئيسية ، ولكن في نهاية المطاف ، يجب إعادة تصميم بنية النظام بطريقة أكثر احترافًا إذا أصبح النموذج الأولي مشروع إنتاج به ما يكفي قاعدة العملاء.

Sails.js: إطار عمل MVC الفائق لـ Node.js

تشترك Sails.js في العديد من أوجه التشابه مع Express. إنه مولد مشروع وبرمجيات وسيطة ومحرك نموذجي. إنه في الواقع مبني على رأس Express بالإضافة إلى بعض وظائف المستوى الأعلى لتسريع التطوير.

MVC

تحكم عرض نموذج

تتبنى Sails.js نمط تصميم Model-View-Controller من جوهرها. بالنسبة لأولئك القادمين من Ruby on Rails أو Laravel ، سيجدون بنية تطبيق Sails.js مألوفة جدًا. النموذج يمثل نموذج البيانات الذي يعكس جدول قاعدة البيانات / مخطط المجموعة ، العرض هو طريقة عرض HTML مع البيانات المملوءة ، المتحكم هو المكان الذي تضع فيه كل منطق الأعمال من جانب الخادم ويعمل كلصق بين البيانات والعرض.

الاتصال في الوقت الحقيقي

ليس مثل طلب HTTP حيث يتعين على العميل الاستعلام عن بيانات الخادم في كل مرة ، أو اتصال الاقتراع الطويل الذي يضع الخادم في وضع الخمول ، ينشئ Socket.io اتصالًا ثنائي الاتجاه قائم على الحدث بين العميل والخادم. يدمج Sails.js Socket.io ويلفها ببعض واجهة برمجة التطبيقات ذات مستوى تجريد أعلى لتوفير مزيد من الراحة ، مما يجعل Sails.js مناسبًا بشكل خاص لإنشاء تطبيقات الدردشة أو الألعاب متعددة اللاعبين.

قاعدة بيانات ORM

قاعدة بيانات ORM

بين منطق الواجهة الخلفية ومعالجة قاعدة البيانات الفعلية ، توجد طبقة ORM وسطية تسمى Waterline. ببساطة ، توفر أداة ORM هذه بنية متسقة للوصول إلى قواعد بيانات مختلفة دون أن يضطر المطورون إلى القلق بشأن لغات استعلام قواعد البيانات المتنوعة ، مثل SQL vs NoSQL و schema vs schema-less وما إلى ذلك.

Sails.js حاصل على درجة أتمتة متوسطة. إنه يركز على منطق جانب الخادم وهو جاهز للإنتاج ، ويوفر وتيرة تطوير أسرع من Express دون التضحية بأي أداء أو قابلية التوسع في المستقبل. على وجه الخصوص بالنسبة للكمية الكبيرة من محبي نمط MVC ، يتمتع Sails.js بمنحنى تعليمي سلس تمامًا.

يتم إحتوائه

لا تُصنّف هذه المقالة إطارات عمل Node.js مختلفة ، بل تسرد النقاط المضيئة في كل إطار لتبرز من بين الحشود لمساعدة مطوري Node.js في اختيار صندوق الأدوات الأكثر ملاءمة عند إنشاء مشروع من الألف إلى الياء.

إذن ما هو إطار عمل Node.js المفضل لديك لتطوير الويب؟ هل تفضل إطار عمل آخر غير تلك التي ناقشناها أعلاه؟ واسمحوا لنا أن نعرف في قسم التعليقات أدناه.

متعلق ب:
  • لماذا بحق الجحيم سأستخدم Node.js؟ برنامج تعليمي لكل حالة على حدة
  • تشفير حمى المقصورة: برنامج تعليمي للجهة الخلفية لـ Node.js
  • بناء Node.js / TypeScript REST API ، الجزء 1: Express.js