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

بجملة واحدة: يتألق Node.js في تطبيقات الويب في الوقت الفعلي التي تستخدم تقنية الدفع عبر مآخذ الويب. ما الشيء الثوري في ذلك؟ حسنًا بعد أكثر من 20 عامًا من استخدام الويب عديم الجنسية استنادًا إلى نموذج الاستجابة للطلب عديم الحالة أصبح لدينا أخيرًا تطبيقات ويب ذات اتصالات ثنائية الاتجاه في الوقت الفعلي حيث يمكن للعميل والخادم بدء الاتصال مما يسمح لهم بتبادل البيانات بحرية . هذا في تناقض صارخ مع نموذج استجابة الويب النموذجي حيث يبدأ العميل دائمًا الاتصال. بالإضافة إلى ذلك يعتمد الأمر كله على مكدس الويب المفتوح (HTML و CSS و JS) الذي يعمل عبر المنفذ القياسي 80.

كيف يعمل Node.js؟

الفكرة الرئيسية لـ Node.js: استخدام الإدخال / الإخراج غير المحظور والمدفوع بالأحداث لتبقى خفيفة الوزن وفعالة في مواجهة تطبيقات الوقت الفعلي كثيفة البيانات التي تعمل عبر الأجهزة الموزعة.

ما يعنيه ذلك حقًا هو أن Node.js ليس منصة جديدة ذات رصاصة فضية ستهيمن على عالم تطوير الويب. بدلاً من ذلك إنها منصة تلبي حاجة معينة.

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

كيف يعمل تحت غطاء محرك السيارة أمر مثير للاهتمام. مقارنةً بتقنيات خدمة الويب التقليدية حيث يُنشئ كل اتصال (طلب) خيطًا جديدًا ويأخذ ذاكرة الوصول العشوائي للنظام ويصل في النهاية إلى الحد الأقصى لمقدار ذاكرة الوصول العشوائي المتاحة يعمل Node.js على مؤشر ترابط واحد باستخدام I / غير المحظور مكالمات O مما يسمح لها بدعم عشرات الآلاف من الاتصالات المتزامنة الموجودة في حلقة الحدث.

Node.js

NPM (node.js package manager): مدير حزمة Node.js

عند مناقشة Node.js هناك شيء واحد لا يجب حذفه بالتأكيد وهو الدعم المدمج لإدارة الحزم باستخدام NPM وهي أداة تأتي افتراضيًا مع كل تثبيت Node.js. تشبه فكرة وحدات NPM إلى حد كبير فكرة Ruby Gems: مجموعة من المكونات المتاحة للجمهور والقابلة لإعادة الاستخدام والمتاحة من خلال التثبيت السهل عبر مستودع عبر الإنترنت مع إدارة الإصدار والاعتماد.

يمكن العثور على قائمة كاملة بالوحدات المجمّعة على موقع الويب npm أو الوصول إليها باستخدام أداة npm CLI التي يتم تثبيتها تلقائيًا مع Node.js. النظام البيئي للوحدة النمطية مفتوح للجميع ويمكن لأي شخص نشر الوحدة الخاصة به والتي سيتم إدراجها في مستودع npm.

وحدات NPM

بعض وحدات NPM الأكثر فائدة اليوم هي:

  • express – Express.js  – أو ببساطة Express  إطار تطوير ويب مستوحى من سيناترا لـ Node.js والمعيار الواقعي لمعظم تطبيقات Node.js الموجودة اليوم.
  • hapi – إطار معياري جدًا وبسيط في الاستخدام يتمحور حول التكوين لبناء تطبيقات الويب والخدمات
  • connect – Connect هو إطار عمل خادم HTTP قابل للتوسيع لـ Node.js يوفر مجموعة من “المكونات الإضافية” عالية الأداء والمعروفة باسم البرامج الوسيطة يعمل كأساس أساسي لـ Express.
  • socket.io و sockjs – مكون من جانب الخادم لاثنين من أكثر مكونات مآخذ الويب شيوعًا الموجودة اليوم.
  • pug (المعروف سابقًا باسم Jade) أحد محركات القوالب الشهيرة المستوحى من HAML وهو محرك افتراضي في Express.js.
  • mongodb و mongojs – أغلفة MongoDB لتوفير واجهة برمجة التطبيقات لقواعد بيانات كائن MongoDB في Node.js.
  • redis – مكتبة عملاء Redis.
  • lodash –  حزام الأداة المساعدة JavaScript. بدأ Underscore اللعبة ولكن تم الإطاحة به من قبل أحد نظرائه ويرجع ذلك أساسًا إلى الأداء الأفضل والتنفيذ المعياري.
  • forever – ربما الأداة الأكثر شيوعًا لضمان تشغيل برنامج نصي للعقدة بشكل مستمر. يحافظ على عملية إنتاج Node.js في مواجهة أي إخفاقات غير متوقعة.
  • bluebird – وعود مميزة كاملة / تنفيذ  A + مع أداء جيد بشكل استثنائي
  • moment – مكتبة تاريخ JavaScript لتحليل التواريخ والتحقق منها ومعالجتها وتنسيقها.

والقائمة تطول. هناك الكثير من الحزم المفيدة حقًا المتاحة للجميع (لا يسيء إلى الحزم التي حذفتها هنا).

أمثلة على مكان استخدام Node.js

الدردشة هي التطبيق الأكثر شيوعًا في الوقت الفعلي متعدد المستخدمين. من IRC  من خلال العديد من البروتوكولات المفتوحة والملكية التي تعمل على منافذ غير قياسية إلى القدرة على تنفيذ كل شيء اليوم في Node.js مع مآخذ ويب تعمل عبر المنفذ القياسي 80.

يُعد تطبيق الدردشة حقًا مثالًا رائعًا لـ Node.js: إنه تطبيق خفيف الوزن وحركة مرور عالية وكثافة البيانات (ولكن معالجة / حساب منخفضة) يتم تشغيله عبر الأجهزة الموزعة. إنها أيضًا حالة استخدام رائعة للتعلم أيضًا لأنها بسيطة لكنها تغطي معظم النماذج التي ستستخدمها على الإطلاق في تطبيق Node.js النموذجي.

كيفية عمل Node.js

دعونا نحاول تصوير كيفية عملها.

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

من جانب الخادم لدينا تطبيق Express.js بسيط ينفذ شيئين:

  • معالج GET / request الذي يخدم صفحة الويب التي تحتوي على كل من لوحة الرسائل وزر “send” لتهيئة إدخال رسالة جديدة و
  • خادم websocket الذي يستمع للرسائل الجديدة المنبعثة من عملاء websocket.

من جانب العميل لدينا صفحة HTML مع إعداد معالجات واحدة لحدث النقر على الزر “send” والتي تلتقط رسالة الإدخال وترسلها إلى أسفل المقبس وأخرى تستمع إلى الرسائل الواردة الجديدة على عميل websockets )على سبيل المثال الرسائل المرسلة من قبل مستخدمين آخرين والتي يريد الخادم الآن أن يعرضها العميل).

عندما ينشر أحد العملاء رسالة، فإليك ما يحدث:

  • يمسك المتصفح زر “send” بالنقر عبر معالج جافا سكريبت ويلتقط القيمة من حقل الإدخال (أي نص الرسالة) ويصدر رسالة websocket باستخدام عميل websocket المتصل بخادمنا (تمت تهيئته عند تهيئة صفحة الويب).
  • يتلقى المكون من جانب الخادم لاتصال websocket الرسالة ويعيد توجيهها إلى جميع العملاء الآخرين المتصلين باستخدام طريقة البث.
  • يتلقى جميع العملاء الرسالة الجديدة كرسالة دفع عبر مكون من جانب العميل websockets يعمل داخل صفحة الويب. ثم يلتقطون محتوى الرسالة ويحدّثون صفحة الويب في مكانها عن طريق إلحاق الرسالة الجديدة باللوحة

API في الجزء العلوي من قاعدة بيانات كائن

على الرغم من أن Node.js يتألق حقًا مع تطبيقات الوقت الفعلي إلا أنه مناسب تمامًا لعرض البيانات من قواعد بيانات الكائن مثل MongoDB. تسمح بيانات JSON المخزنة لـ Node.js بالعمل بدون عدم تطابق المعاوقة وتحويل البيانات.

على سبيل المثال إذا كنت تستخدم ريلز فيمكنك التحويل من JSON إلى نماذج ثنائية ثم تعرضها مرة أخرى كـ JSON عبر HTTP عندما يتم استهلاك البيانات بواسطة Backbone.js أو Angular.js وما إلى ذلك أو حتى jQuery AJAX العادي المكالمات. باستخدام Node.js يمكنك ببساطة عرض كائنات JSON باستخدام واجهة برمجة تطبيقات REST ليستخدمها العميل. بالإضافة إلى ذلك لا داعي للقلق بشأن التحويل بين JSON وأي شيء آخر عند القراءة أو الكتابة من قاعدة البيانات (إذا كنت تستخدم MongoDB). باختصار، يمكنك تجنب الحاجة إلى تحويلات متعددة باستخدام تنسيق تسلسل بيانات موحد عبر العميل والخادم وقاعدة البيانات.

المدخلات المصفوفه (QUEUED)

إذا كنت تتلقى قدرًا كبيرًا من البيانات المتزامنة يمكن أن تصبح قاعدة بياناتك عنق زجاجة. كما هو موضح أعلاه يمكن لـ Node.js التعامل بسهولة مع الاتصالات المتزامنة بنفسها. ولكن نظرًا لأن الوصول إلى قاعدة البيانات عملية حظر (في هذه الحالة) فإننا نواجه مشكلة. الحل هو الاعتراف بسلوك العميل قبل أن تتم كتابة البيانات بالفعل في قاعدة البيانات.

من خلال هذا النهج يحافظ النظام على استجابته في ظل عبء ثقيل وهو أمر مفيد بشكل خاص عندما لا يحتاج العميل إلى تأكيد قاطع لكتابة البيانات الناجحة. تشمل الأمثلة النموذجية: تسجيل بيانات تتبع المستخدم أو كتابتها ومعالجتها على دفعات وعدم استخدامها حتى وقت لاحق بالإضافة إلى العمليات التي لا تحتاج إلى أن تنعكس على الفور (مثل تحديث عدد “likes” على Facebook) حيث يكون التناسق النهائي (غالبًا ما يستخدم في عالم NoSQL) مقبولًا.

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

باختصار: باستخدام Node يمكنك دفع عمليات الكتابة في قاعدة البيانات إلى الجانب والتعامل معها لاحقًا والمتابعة كما لو كانت قد نجحت.

دفق البيانات (data streaming)

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

Proxy

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

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

على الرغم من وجود خوادم بروكسي مخصصة إلا أن استخدام Node بدلاً من ذلك قد يكون مفيدًا إذا كانت البنية التحتية للوكيل غير موجودة أو إذا كنت بحاجة إلى حل للتنمية المحلية. أعني بهذا أنه يمكنك إنشاء تطبيق من جانب العميل باستخدام خادم تطوير Node.js للأصول وطلبات واجهة برمجة التطبيقات الوكيلة / المتوقفة بينما في الإنتاج يمكنك التعامل مع مثل هذه التفاعلات مع خدمة وكيل مخصصة (nginx ، HAProxy إلخ).

brokerage – لوحة معلومات تاجر الأسهم

لنعد إلى مستوى التطبيق. مثال آخر حيث تهيمن برامج سطح المكتب ولكن يمكن استبدالها بسهولة بحل ويب في الوقت الفعلي هو برنامج تداول الوسطاء المستخدم لتتبع أسعار الأسهم وإجراء الحسابات / التحليل الفني وإنشاء الرسوم البيانية / الرسوم البيانية.

من شأن التبديل إلى حل قائم على الويب في الوقت الفعلي أن يسمح للوسطاء بالتبديل بسهولة بين محطات العمل أو أماكن العمل. قريباً قد نبدأ في رؤيتهم على الشاطئ في فلوريدا .. أو إيبيزا .. أو بالي.

التطبيق لوحة التحكم

حالة استخدام شائعة أخرى تتناسب فيها Node-with-web-sockets تمامًا: تتبع زوار موقع الويب وتصور تفاعلاتهم في الوقت الفعلي.

يمكنك جمع إحصاءات في الوقت الفعلي من المستخدم الخاص بك أو حتى نقلها إلى المستوى التالي من خلال تقديم تفاعلات مستهدفة مع زوارك من خلال فتح قناة اتصال عندما يصلون إلى نقطة معينة في مسار التحويل الخاص بك. (إذا كنت مهتمًا فهذه الفكرة يتم إنتاجها بالفعل بواسطة CANDDi).

تخيل كيف يمكنك تحسين عملك إذا كنت تعرف ما يفعله زوارك في الوقت الفعلي – إذا كان بإمكانك تصور تفاعلاتهم. مع مقابس الوقت الفعلي ثنائية الاتجاه لـ Node.js يمكنك الآن.

لوحة معلومات مراقبة النظام

الآن دعنا ننتقل إلى جانب البنية التحتية للأشياء. تخيل على سبيل المثال موفر SaaS يريد أن يقدم لمستخدميه صفحة مراقبة الخدمة مثل صفحة حالة GitHub. باستخدام حلقة الأحداث Node.js يمكننا إنشاء لوحة تحكم قوية قائمة على الويب تتحقق من حالات الخدمات بطريقة غير متزامنة وتدفع البيانات إلى العملاء باستخدام مآخذ الويب.

يمكن الإبلاغ عن حالات الخدمات الداخلية (داخل الشركة) والخدمات العامة مباشرةً وفي الوقت الفعلي باستخدام هذه التقنية. ادفع بهذه الفكرة إلى أبعد من ذلك وحاول تخيل تطبيقات مراقبة مركز عمليات الشبكة NOC) في مشغل اتصالات أو مزود خدمة سحابية / شبكة / استضافة أو بعض المؤسسات المالية تعمل جميعها على مكدس الويب المفتوح المدعوم من Node.js و websockets بدلاً من Java و / أو تطبيقات Java الصغيرة.

المصدر

منشور ذات صلة
هز الأشجار (tree shaking) 2 Minutes

شجرة تهز الخير!

محمدباقر عبيات

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

Scala.js 11 Minutes

استخدام Scala.js مع NPM و Browserify

جاسم ناظري

إذا كنت تستخدم Scala.js مترجم لغة Scala إلى JavaScript فقد تجد أن إدارة التبعية القياسية لـ Scala.js محدودة للغاية في عالم JavaScript الحديث. يدير Scala.js التبعيات باستخدام WebJars.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

السلة