Node.js بيئة تشغيل (runtime) تنفّذ JavaScript خارج المتصفح: على خادم، أو في الطرفية، أو كأداة سطر أوامر. ليس لغة برمجة (اللغة هي JavaScript) وليس إطار عمل (Express إطار عمل يعمل فوق Node.js). يجمع محرك V8 من Google، الذي ينفّذ JavaScript، مع حلقة أحداث (event loop) وواجهات مدمجة للملفات والشبكات والعمليات لا تملكها المتصفحات.
طبع محتوى الملف، ورقم النسخة الرئيسية (v24)، وundefined لـ window، لأن Node.js لا يملك صفحة ويب تعطيك هذا الكائن. الكائنان fs وprocess موجودان في Node.js فقط؛ شغّل الأسطر نفسها في تبويب متصفح وسيرمي السطر الأول خطأ.
هل Node.js إطار عمل أم لغة؟
لا هذا ولا ذاك. اللغة هي JavaScript. وNode.js هو البرنامج الذي يشغّلها، كما يشغّل JVM لغة Java ويشغّل CPython لغة Python. أما أطر العمل فتأتي فوقه: Express وFastify وNestJS مكتبات تثبّتها داخل مشروع Node.js. تقارن صفحة Node.js مقابل JavaScript بين الاثنين بالتفصيل.
من الداخل، يتكوّن Node.js من أربعة أجزاء:
- V8، محرك JavaScript من Chrome. يحوّل شيفرتك إلى شيفرة آلة وينفّذها.
- libuv، مكتبة بلغة C توفّر حلقة الأحداث وتنجز العمل البطيء (القرص والشبكة والمؤقتات) في الخلفية، ثم تعيد النتيجة إلى دوال callback الخاصة بك.
- واجهات Node نفسه:
fsللملفات، وhttpللخوادم، وpathوprocessوcryptoوeventsوغيرها، متاحة عبرrequireأوimportدون أي تثبيت. - npm، مدير الحزم الذي يأتي مع Node.js ويمنحك الوصول إلى أكبر مستودع حزم لأي لغة.
كيف تشغّل ملف Node.js
ثبّت Node.js من موقعه الرسمي (اختر نسخة LTS)، ثم تحقق منه في الطرفية وشغّل ملفًا:
node --version # prints v24.x.x or similar
node app.js # runs app.js and exits when it has nothing left to do
node # with no file: an interactive prompt (the REPL)
ينتهي البرنامج من تلقاء نفسه حين لا يبقى شيء ينتظره: لا مؤقت، ولا خادم مفتوح، ولا قراءة ملف معلّقة. لهذا ينتهي السكربت بينما يبقى خادم الويب يعمل.
الإدخال والإخراج غير الحاجب، الفكرة الأساسية
لا ينتظر Node.js العمل البطيء. يبدأ قراءة ملف أو طلبًا شبكيًا، ويواصل تنفيذ الأسطر التالية، ثم يستدعي دالتك حين تجهز النتيجة.
سطرا console.log الواقعان بعد readFile نُفّذا أولًا، ووصل محتوى الملف في النهاية. هكذا تخدم عملية Node.js واحدة آلاف الاتصالات: بينما ينتظر طلب ما قاعدة البيانات، تُبقي حلقة الأحداث بقية الطلبات تتقدم.
Node.js مقابل المتصفح
| المتصفح | Node.js | |
|---|---|---|
| يعمل | داخل صفحة ويب | في الطرفية أو على خادم |
| يملك | window وdocument وDOM وlocalStorage | fs وprocess وhttp وBuffer وrequire |
| الكائن العام | window (وglobalThis) | global (وglobalThis) |
| الملفات على القرص | لا وصول إليها | وصول كامل، بصلاحيات المستخدم الحالي |
setTimeout وconsole وfetch وURL | نعم | نعم |
فيمَ يُستخدم Node.js
- خوادم الويب والواجهات البرمجية (APIs): خلفيات REST وGraphQL، وغالبًا مع Express.
- التطبيقات الآنية: الدردشة، ولوحات المتابعة الحية، والألعاب الجماعية عبر WebSockets، حيث تبقى اتصالات كثيرة مفتوحة في الوقت نفسه.
- أدوات سطر الأوامر: npm نفسه وVite وESLint وPrettier ومترجم TypeScript كلها تعمل على Node.js.
- السكربتات والأتمتة: إعادة تسمية الملفات، واستدعاء الواجهات البرمجية، وترحيل البيانات.
الاستخدام الأشيع هو خادم HTTP، والوحدة المدمجة http تكفي لأول خادم:
أجاب الخادم على GET /hello بالمسار الذي استقبله. غيّر المسار في شريط الطلب إلى /anything وأرسله: يتغير الرد معه، لأن هذا الخادم يعالج كل عنوان URL بدالة واحدة.
متى تختار Node.js
اختر Node.js حين يكون معظم العمل انتظارًا للإدخال والإخراج (الطلبات وقواعد البيانات والملفات) وتريد لغة واحدة للواجهة الأمامية والخلفية. وهو أقل ملاءمة للحسابات الطويلة التي تستهلك المعالج، مثل ترميز الفيديو أو العمليات الرقمية الكبيرة، لأن الحساب الطويل يحجب خيط JavaScript الوحيد فتنتظره كل الطلبات الأخرى.
الأسئلة الشائعة
هل Node.js للواجهة الأمامية أم الخلفية؟
للواجهة الخلفية في الغالب. يعمل Node.js على خادم أو على جهازك، لا في متصفح الزائر. ومع ذلك يستخدمه مطورو الواجهة الأمامية كل يوم، لأن أدوات مثل npm وVite وESLint برامج مكتوبة لـ Node.js.
من أنشأ Node.js ومتى؟
أطلق Ryan Dahl منصة Node.js عام 2009. تتولى صيانتها اليوم مؤسسة OpenJS، وتصدر نسخة رئيسية جديدة كل ستة أشهر، وتحصل النسخ ذات الأرقام الزوجية على دعم طويل الأمد.
هل أحتاج إلى معرفة JavaScript قبل Node.js؟
نعم، الأساسيات على الأقل: المتغيرات والدوال والكائنات والمصفوفات، ودوال callback أو الوعود (promises). يضيف Node.js واجهات برمجية لا صياغة جديدة، فكل ما تتعلمه عن اللغة ينطبق عليه مباشرة.
هل Node.js أحادي الخيط؟
شيفرة JavaScript الخاصة بك تعمل على خيط واحد. ويستخدم Node.js في الخلفية مجموعة صغيرة من الخيوط لعمليات نظام الملفات وDNS وبعض عمليات التشفير، فلا يحجب الإدخال والإخراج البطيء شيفرتك أثناء الانتظار.