Node.js، الفرق بين بيئة التطوير والإنتاج
لا يوجد فرق بين بيئة التطوير والإنتاج في Node.js
، أي لا توجد إعدادات محددة تحتاج إلى تطبيقها لجعل Node.js يعمل في تكوين إنتاج. ومع ذلك، تتعرف بعض المكتبات في سجل npm على استخدام متغير NODE_ENV
وتعيينه افتراضيًا إلى إعداد development
. قم دائمًا بتشغيل Node.js مع تعيين NODE_ENV=production
.
طريقة شائعة لتكوين تطبيقك هي استخدام منهجية العوامل الاثني عشر.
NODE_ENV في Express
في إطار عمل express الشهير للغاية، يضمن تعيين NODE_ENV للإنتاج بشكل عام ما يلي:
- يتم الاحتفاظ بتسجيل الدخول إلى الحد الأدنى، مستوى أساسي
- تحدث المزيد من مستويات التخزين المؤقت لتحسين الأداء
يتم ذلك عادةً بتنفيذ الأمر
export NODE_ENV=production
في shell، ولكن من الأفضل وضعه في ملف تكوين shell الخاص بك (مثل .bash_profile
مع Shell Bash) لأنه خلاف ذلك، لا يستمر الإعداد في حالة إعادة تشغيل النظام.
يمكنك أيضًا تطبيق متغير البيئة عن طريق إرفاقه بأمر تهيئة تطبيقك:
NODE_ENV=production node app.js
على سبيل المثال، في تطبيق Express، يمكنك استخدام هذا لتعيين معالجات أخطاء مختلفة لكل بيئة:
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
في قيام المطورين بدمج التحسينات وسلوك البرنامج مع البيئة التي يعمل عليها برنامجهم. والنتيجة هي رمز مثل ما يلي:
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
نمطًا مضادًا.