تعتبر Node.js بيئة تشغيل- runtime environment خاصة بلغة جافا سكريبت- JavaScript. عظيم؛ لكن ماذا يعني ذلك؟ وكيف تعمل؟ تتضمن بيئة التشغيل الخاصة بـ Node.js كل ما تحتاجه لتنفيذ برنامج مكتوب بلغة JavaScript.
ما هو Node.js؟ هنا كل ماتحتاج لمعرفته

ظهرت تقنية Node.js عندما وسع المطورون الأصليون نطاق لغة JavaScript من لغة لا يمكنك تنفيذها إلا من خلال المتصفح browser إلى شيء يمكنك تشغيله على جهازك مباشرة في شكل تطبيق مستقل، وبذلك اصبح بالإمكان فعل كثيرٍ من الأمور باستخدام لغة JavaScript أكثر من مجرد جعل مواقع الويب تفاعلية.
الآن؛ أصبح لدى لغة JavaScript القدرة على القيام بأشياء يمكن أن تفعلها اللغات النصية – scripting languages الأخرى مثل لغة الـ Python (وهي لغات مُعدّة لتنفيذ مهامٍ بغرض التحكم بالتطبيق المبني وتُعالَج باستخدام المفسر interpreter لا المترجم compiler).
Node.js
1- هي بيئة تشغيل خاصة بلغة JavaScript مبنية باستخدام محرك متصفح Chrome الذي يدعى V8.
تُنَّفَذ لغة JavaScript في متصفح Chrome باستخدام محرك التشغيل V8 (وهو محرك مفتوح المصدر مكتوب بلغة ++C)، إذ يوجد لكل متصفح المحرك الخاص به، وهو نفس المحرك الذي تستخدمه Node.js.
يمكن تشغيل محرك V8 بشكل مستقل، أو يمكن تضمينه في أي تطبيق مكتوب بلغة ++C، كذلك يحتوي على إضافات تسمح لك بكتابة كود بلغة ++C وجعله متاحًا للاستخدام في JavaScript.
يأخذ هذا المحرك الكود المكتوب بلغة JavaScript ويحوله إلى لغة الآلة Machine code التي يمكن للحاسوب تنفيذها بشكل مباشر وسريع؛ حيث إن لغة الآلة هي كود منخفض المستوى أقرب إلى كونه مجموعة من 0 و1 يمكن للحاسوب تنفيذه مباشرة دون الحاجة إلى تفسيره وتحويله إلى لغة اخرى.
2- تستخدم Node.js أنموذج event-driven, non-blocking I/O model والذي يجعلها أكثر كفاءة كذلك تشغل حيزًا أقل في الذاكرة.
يشير الاختصار I/O إلى Input/Output أي المدخلات والمخرجات والتي يمكن أن تكون أي شيء بدءًا من قراءة/ كتابة الملفات ووصولًا إلى إرسال طلب HyperText Transfer Protocol HTTP إلى أحد الواجهات البرمجية الخاصة بأحد التطبيقات application programming interface: API.
الآن لنفترض أننا نريد الإتصال بقاعدة بيانات للحصول على تفاصيل المستخدم 1 والمستخدم 2 ثم طباعتها على الشاشة. تستغرق الاستجابة لهذا الطلب وقتًا؛ ولكن يمكن تنفيذ كلا الطلبين في آن معًا وبشكل مستقل باستخدام أنموذج يدعى بال non-blocking I/O .

تمثل الصورة إلى اليسار أنموذج ال blocking حيث لا يمكن البدء بتنفيذ أي طلب جديد للحصول على بيانات المستخدم 2 قبل الإنتهاء تماما من تنفيذ الطلب السابق للحصول على بيانات المستخدم 1. ويلاحظ أن هذا الأنموذج يستغرق وقتا أطول في التنفيذ مقارنة بأنموذج ال non-blocking يمين الصورة.
· Blocking I/O:
في هذه الطريقة لا يُرسَل طلب HTTP للحصول على بيانات المستخدم 2 حتى تُطبَع بيانات المستخدم 1 على الشاشة ويتم الإنتهاء تمامًا من تنفيذ الطلب الأول.
في حال كانت طلبات الحصول على البيانات مرسلة إلى خادم ويب، فسيتعين علينا إنشاء نسيب thread لكل مستخدم جديد.
يعد الـ threading -أحيانا يسمى multithreading- نوعًا من نماذج التنفيذ execution model التي تسمح بوجود multiple threads في سياق عملية process بحيث يتم تنفيذ هذه threads بشكل مستقل مع مشاركة موارد العملية الخاصة بها؛ وللتبسيط يمكن اعتبار النسيب thread أنه نافذة جديدة في المتصفح الخاص بك باستخدام طريقة blocking فإننا بحاجة لفتح نافذة جديدة لكل طلب HTTP للحصول على بيانات المستخدم 1 و 2 في فترة زمنية قصيرة، والا فاننا بحاجة للانتظار حتى الانتهاء من تنفيذ طلب الحصول على بيانات المستخدم 1 تماما ثم البدء بإرسال طلب الحصول على بيانات المستخدم 2.
لكنّ لغة JavaScript تعتبر single-threaded (لنكن دقيقين أكثر تحتوي على single-threaded event loop والتي سنناقشها بالتفصيل في مقال قادم) وهذا يجعلها غير مناسبة لتنفيذ عدة مهام معا multi-threaded tasks.
في الحقيقة ليس تماما لأن لغة JavaScript تستخدم أنموذج Non-blocking I/O.
· Non-blocking I/O :
تمكننا هذه الطريقة البدء بإرسال طلب HTTP للحصول على بيانات المستخدم 2 دون انتظار الاستجابة لطلب المستخدم1، حيث يمكن إنشاء الطلبين في آن معًا.
يوفرعلينا هذا النوع الحاجة إلى استخدام multi-threading لأن الخادم يمكنه التعامل مع طلبات متعددة في نفس الوقت.
3- نظام إدارة الحزم package manager الأساسي المستخدم في Node.js هو npm والذي يعد مفتوح المصدر ويحتوي على آلاف الحزم البرمجية المتاحة للاستخدام المجاني.
يعد نظام إدارة الحزم في الأساس وسيلة لأتمتة عملية تثبيت البرامج أو تحديثها أو تكوينها أو إزالتها.
يحتوي npm على أداة تسمى npx والتي سهلت على المبرمجين تجنب مشاكلات التعارض في نسخ الإصدارات ومشكلات التبعية؛ أضف أنها حلت مشكلة تثبيت الحزم غير الضرورية التي نريد فقط تجربتها.
في عام 2016؛ أنشأ المطورون في شركة فيسبوك نظام إدارة حزم جديد أسموه yarn لحل المشكلات التي واجهوها في أثناء استخدام npm خاصةً تلك المتعلقة بالتناسق والأمان والسرعة. يحتوي yarn على نفس مجموعة الميزات لدى npm إلا أنه يعمل بسرعة أكبر وأمان أكثر والأهم من ذلك أنه أكثر موثوقية.
سنقارن بشكل بين npm و yarn من ناحية:
1- السرعة:
من ناحية سرعة التثبيت؛ يتفوق yarn على npm،إذ أُجريَت العديد من الاختبارات المعيارية benchmark tests كان نتاجها تفوق نظام yarn على npm في كل معيار؛ هذا يرجع إلى حقيقة أن yarn يثبت حزم متعددة في وقت واحد مقارنةً بـ npm الذي يقوم بتثبيت حزمة واحدة في كل مرة.

توضح الصورة متوسط الوقت المستغرق للتحميل لحزمة معينة بين النظامين؛ إذ استغرق نظام npm ما معدله 4 أضعاف الوقت الذي تطلبه نظام yarn.
2- الأمان:
سبب آخر لتطوير شركة فيسبوك نظام yarn هي مشكلات الأمان التي يواجهها نظام npm؛ يسمح نظام npm بالبدء بتنفيذ التعليمات البرمجية الخاصة بالحزم بعد التثبيت مباشرة، وعلى الرغم من امتلاك هذه الميزة إيجابيات، إلا أنها أثارت بعض المخاوف الأمنية.
بينما في نظام yarn؛ لا تُثبَّت الحزم إلا من ملفات معينة على الحاسوب تدعى yarn.lock أو package.json. يضمن ملف yarn.lock تثبيت نفس الحزمة في جميع الأجهزة، وهذا يقلل من احتمال وجود أخطاء من تثبيت إصدارات مختلفة. إذ واجهت شركة فيسبوك مشكلات في الاتساق مع نظام npm عند تثبيت التبعيات dependencies عبر عدة مستخدمين أو أجهزة. يمكننا أيضًا استخدام نظام yarn في حال عدم وجود اتصال بالشبكة لإعادة تثبيت الحزم، في حال ثبَّتها المستخدم مسبقًا (علمًا أن نظام npm يحتاج إلى اتصال بالإنترنت لتثبيت الحزم.)
يجدر الإشارة أنه بدءا من الإصدار 5.0 لنظام npm تم حل العديد من المشاكل السابقة التي كانت تواجه هذا النظام حيث أصبح حاليا منافسا قويا لنظام yarn. (الا ان نظام yarn ما يزال متصدرا من ناحية السرعة ولو قليلا).
تعريف الـ Node Modules
مجموعة من الأسطر البرمجية التي يمكن إعادة استخدامها ولا يؤثر وجودها -ولو عن طريق الخطأ- على أي تعليمات برمجية اخرى.
يمكنك كتابة الوحدات Modules الخاصة بك واستخدامها في تطبيقات مختلفة، يحتوي Node.js على مجموعة من الوحدات المدمجة التي يمكنك استخدامها دون الحاجة لتثبيت أي إضافات أخرى.
سهلت بيئة التشغيل node.js تنفيذ وكتابة أسطر و أوامر برمجية باستخدام لغة javascript لبرمجة الserver-side -أو backend- دون الحاجة إلى استخدام أو تعلم لغات اخرى مثل لغة php أو C#، كذلك تتمتع بدعم عدد كبير من المطورين باعتبارها مفتوحة المصدر open-source، وعلى الرغم من ظهور بعض المنافسين الجدد لها مثل بيئة التشغيل deno إلا أنه لا يُتوقَّع الاستغناء عنها في الأمد القريب.
المصادر والمراجع: freecodecamp ~ What is Multithreading? ~ medium
- إعداد: ياسر طبيله.
- مراجعة: نور عبدو.