الكائن العالمي (Global Object) في Node.js وكيفية استخدامه
ماذا سنتعلم اليوم؟ سنتعمق في فهم الكائن العالمي global في Node.js، وهو المكافئ لـ window في المتصفحات، وكيفية استخدامه لإدارة المتغيرات والوظائف المتاحة عالميًا.
الخطوة 1: فهم الكائن global والوظائف المؤقتة
في Node.js، الكائن global هو المكان الذي تُخزّن فيه جميع المتغيرات والوظائف المتاحة بشكل عام في جميع وحدات تطبيقك (modules). هذا يشمل دوال مثل setTimeout و setInterval.
ملاحظة تقنية: على عكس المتصفحات حيث تُضاف المتغيرات المُعرّفة بدون
varأوletأوconstتلقائيًا إلى الكائنwindow، في Node.js، تُضاف هذه المتغيرات إلى نطاق الوحدة (module scope) وليس إلى الكائنglobalمباشرةً إلا إذا قمت بتعيينها صراحةً علىglobal.
لنبدأ بمثال بسيط يوضح استخدام setTimeout، وهي دالة عالمية:
// تعريف دالة سيتم استدعاؤها بعد فترة زمنية محددة
function greet() {
console.log('مرحباً من الكائن العالمي!');
}
// استخدام setTimeout، وهي دالة متاحة عالمياً (جزء من الكائن global)
// سيتم تنفيذ الدالة greet بعد 2000 مللي ثانية (2 ثانية)
setTimeout(greet, 2000);
console.log('تم جدولة التحية...');
// يمكننا الوصول إلى الكائن العالمي مباشرة
// console.log(global.setTimeout === setTimeout); // ستُرجع true
الخطوة 2: تعريف المتغيرات العالمية والوصول إلى كائن process
يمكنك تعريف المتغيرات الخاصة بك على الكائن global لجعلها متاحة في أي مكان في تطبيق Node.js الخاص بك. بالإضافة إلى ذلك، Node.js يوفر كائنات عالمية مفيدة مثل process الذي يمنحك معلومات حول العملية الحالية والتحكم فيها.
ملاحظة تقنية: استخدام المتغيرات العالمية بكثرة يمكن أن يؤدي إلى تعقيد التعليمات البرمجية ويجعل تتبع تبعياتها صعبًا. يفضل استخدام نظام الوحدات (modules) الخاص بـ Node.js لتنظيم الكود.
// تعريف متغير عالمي عن طريق إضافته إلى الكائن global
global.appName = 'My Node.js App';
// الوصول إلى المتغير العالمي من أي مكان آخر
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">اسم التطبيق: ${global.appName}</code>);
// كائن process هو كائن عالمي يوفر معلومات حول عملية Node.js الحالية
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">إصدار Node.js: ${process.version}</code>);
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">نظام التشغيل: ${process.platform}</code>);
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">معرف العملية: ${process.pid}</code>);
// يمكننا أيضاً إضافة دالة عالمية
global.logMessage = (message) => {
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">[رسالة عالمية]: ${message}</code>);
};
// استخدام الدالة العالمية
logMessage('هذه رسالة من دالة عالمية.');
الخطوة 3: المتغيرات العالمية الخاصة بالوحدة (Module-specific Globals)
بعض المتغيرات مثل __dirname و __filename تبدو وكأنها عالمية، وهي متاحة في نطاق كل وحدة (module scope) ولكنها ليست جزءًا من الكائن global نفسه. هي توفر معلومات سياقية خاصة بالملف الذي تُنفذ فيه.
ملاحظة تقنية:
__dirnameو__filenameهي متغيرات سحرية (magic variables) يوفرها Node.js لكل وحدة. إنها مفيدة جدًا لتحديد المسارات المطلقة للملفات والمجلدات.
// __filename: المسار المطلق للملف الحالي بما في ذلك اسم الملف
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">مسار الملف الحالي: ${__filename}</code>);
// __dirname: المسار المطلق للمجلد الذي يحتوي على الملف الحالي
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">مسار المجلد الحالي: ${__dirname}</code>);
// الكائن module هو أيضاً متاح في نطاق الوحدة ويوفر معلومات عن الوحدة الحالية
// console.log(module);
// الكائن exports هو اختصار لـ module.exports ويستخدم لتصدير الوحدات
// console.log(exports === module.exports); // ستُرجع true
الكود النهائي الكامل
هذا هو السكربت الكامل الذي يجمع كل الأمثلة التي ناقشناها:
// الكائن العالمي (Global Object) في Node.js وكيفية استخدامه
// --- الخطوة 1: فهم الكائن global والوظائف المؤقتة ---
// تعريف دالة سيتم استدعاؤها بعد فترة زمنية محددة
function greet() {
console.log('مرحباً من الكائن العالمي!');
}
// استخدام setTimeout، وهي دالة متاحة عالمياً (جزء من الكائن global)
// سيتم تنفيذ الدالة greet بعد 2000 مللي ثانية (2 ثانية)
setTimeout(greet, 2000);
console.log('تم جدولة التحية...');
// --- الخطوة 2: تعريف المتغيرات العالمية والوصول إلى كائن process ---
// تعريف متغير عالمي عن طريق إضافته إلى الكائن global
global.appName = 'My Node.js App';
// الوصول إلى المتغير العالمي من أي مكان آخر
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">اسم التطبيق: ${global.appName}</code>);
// كائن process هو كائن عالمي يوفر معلومات حول عملية Node.js الحالية
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">إصدار Node.js: ${process.version}</code>);
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">نظام التشغيل: ${process.platform}</code>);
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">معرف العملية: ${process.pid}</code>);
// يمكننا أيضاً إضافة دالة عالمية
global.logMessage = (message) => {
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">[رسالة عالمية]: ${message}</code>);
};
// استخدام الدالة العالمية
logMessage('هذه رسالة من دالة عالمية.');
// --- الخطوة 3: المتغيرات العالمية الخاصة بالوحدة (Module-specific Globals) ---
// __filename: المسار المطلق للملف الحالي بما في ذلك اسم الملف
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">مسار الملف الحالي: ${__filename}</code>);
// __dirname: المسار المطلق للمجلد الذي يحتوي على الملف الحالي
console.log(<code dir="ltr" style="background:#f3f4f6; color:#0056b3; padding:2px 6px; border-radius:4px; font-family:monospace; direction:ltr !important; display:inline-block;">مسار المجلد الحالي: ${__dirname}</code>);
النتيجة المتوقعة
عند تشغيل هذا السكربت باستخدام node your_script_name.js، ستحصل على مخرجات مشابهة لما يلي في وحدة التحكم:
تم جدولة التحية... اسم التطبيق: My Node.js App إصدار Node.js: v18.17.1 (قد يختلف حسب إصدار Node.js لديك) نظام التشغيل: linux (قد يختلف حسب نظام التشغيل لديك) معرف العملية: 12345 (سيكون رقماً مختلفاً في كل مرة) [رسالة عالمية]: هذه رسالة من دالة عالمية. مسار الملف الحالي: /path/to/your/script_name.js مسار المجلد الحالي: /path/to/your مرحباً من الكائن العالمي! (ستظهر بعد ثانيتين من بدء التشغيل)
لاحظ أن رسالة 'مرحباً من الكائن العالمي!' ستظهر بعد ثانيتين من باقي المخرجات بسبب استخدام setTimeout.