Skip to content

Node.js، الفرق بين بيئة التطوير والإنتاج

لا يوجد فرق بين بيئة التطوير والإنتاج في Node.js، أي لا توجد إعدادات محددة تحتاج إلى تطبيقها لجعل Node.js يعمل في تكوين إنتاج. ومع ذلك، تتعرف بعض المكتبات في سجل npm على استخدام متغير NODE_ENV وتعيينه افتراضيًا إلى إعداد development. قم دائمًا بتشغيل Node.js مع تعيين NODE_ENV=production.

طريقة شائعة لتكوين تطبيقك هي استخدام منهجية العوامل الاثني عشر.

NODE_ENV في Express

في إطار عمل express الشهير للغاية، يضمن تعيين NODE_ENV للإنتاج بشكل عام ما يلي:

  • يتم الاحتفاظ بتسجيل الدخول إلى الحد الأدنى، مستوى أساسي
  • تحدث المزيد من مستويات التخزين المؤقت لتحسين الأداء

يتم ذلك عادةً بتنفيذ الأمر

bash
export NODE_ENV=production

في shell، ولكن من الأفضل وضعه في ملف تكوين shell الخاص بك (مثل .bash_profile مع Shell Bash) لأنه خلاف ذلك، لا يستمر الإعداد في حالة إعادة تشغيل النظام.

يمكنك أيضًا تطبيق متغير البيئة عن طريق إرفاقه بأمر تهيئة تطبيقك:

bash
NODE_ENV=production node app.js

على سبيل المثال، في تطبيق Express، يمكنك استخدام هذا لتعيين معالجات أخطاء مختلفة لكل بيئة:

javascript
if (process.env.NODE_ENV === 'development') {
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
}
if (process.env.NODE_ENV === 'production') {
  app.use(express.errorHandler());
}

على سبيل المثال، Pug، مكتبة القوالب المستخدمة بواسطة Express.js، تُجمّع في وضع التصحيح إذا لم يتم تعيين NODE_ENV إلى production. يتم تجميع طرق عرض Express في كل طلب في وضع التطوير، بينما يتم تخزينها مؤقتًا في الإنتاج. هناك العديد من الأمثلة الأخرى.

يُعتبر هذا متغير البيئة اتفاقية شائعة الاستخدام في المكتبات الخارجية، ولكن ليس داخل Node.js نفسه.

لماذا يُعتبر NODE_ENV نمطًا مضادًا؟

البيئة هي نظام أساسي رقمي أو نظام حيث يمكن للمهندسين بناء منتجات البرمجيات واختبارها ونشرها وإدارتها. تقليديًا، هناك أربع مراحل أو أنواع من البيئات التي يتم تشغيل تطبيقنا عليها:

  • التطوير
  • الإعداد
  • الإنتاج
  • الاختبار

تكمن المشكلة الأساسية لـ NODE_ENV في قيام المطورين بدمج التحسينات وسلوك البرنامج مع البيئة التي يعمل عليها برنامجهم. والنتيجة هي رمز مثل ما يلي:

javascript
if (process.env.NODE_ENV === 'development') {
  // ...
}
if (process.env.NODE_ENV === 'staging') {
  // ...
}
if (process.env.NODE_ENV === 'production') {
  // ...
}
if (process.env.NODE_ENV === 'testing') {
  // ...
}

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