تكوين تطبيقات TypeScript: المكتبات والأدوات

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

تكوين تطبيقات TypeScript: مراجعة الأدوات والمكتبات

نادرًا ما يعمل تطبيق TypeScript الحديث في عزلة. فهو يحتاج إلى معرفة قاعدة البيانات التي سيتصل بها، والمنفذ الذي سيستخدمه، وأين توجد واجهات برمجة التطبيقات (API) الخارجية، وكيفية التصرف في بيئات مختلفة (التطوير، التجهيز، الإنتاج). التكوين الجيد ليس مجرد تخزين للإعدادات، بل هو نظام متكامل يشمل التحقق من الصحة، والتصنيف النوعي، والأمان.

في هذه المقالة، سنستعرض الأدوات والمكتبات الرئيسية لإدارة التكوين في مشاريع TypeScript، بدءًا من الحلول البسيطة وصولاً إلى المعايير الصناعية.



لماذا نحتاج إلى تكوين منفصل؟

توجد عدة طرق لتخزين الإعدادات، ولكل منها عيوب:

  • الترميز الثابت في المصادر — ينتهك مبدأ تطبيق 12-factor، حيث يختلط التكوين مع الكود، ولا يمكن تغيير السلوك دون إعادة بناء.
  • متغيرات البيئة (process.env) — طريقة قياسية، لكن جميع القيم تكون نصوصًا، ولا يوجد تحقق من الصحة، ومن السهل ارتكاب أخطاء إملائية.
  • ملفات JSON/YAML — مريحة، لكن يجب التعامل مع إصداراتها بحذر لتجنب تسريب الأسرار إلى المستودع.

يضيف TypeScript طبقة أخرى: نريد أن يكون التكوين مصنفًا بشكل صارم وأن يتم اكتشاف الأخطاء في مرحلة التجميع، وليس في وقت التشغيل.



مكتبات للعمل مع متغيرات البيئة



dotenv

المكتبة الأكثر شيوعًا لتحميل المتغيرات من ملفات .env. تُستخدم دائمًا تقريبًا في مشاريع TypeScript.

// npm install dotenv @types/dotenvimport dotenv from 'dotenv';

dotenv.config(); // تحميل .env إلى process.env

console.log(process.env.PORT); // '3000' — نص

الميزات:

  • تعمل مع أي إطار عمل (Express، NestJS، Next.js).
  • تدعم عدة ملفات (.env.local، .env.production).
  • لا تقوم بالتحقق من الصحة — فقط التحميل.


env-var

إضافة فوق process.env تضيف التحقق من الصحة وتحويل الأنواع مباشرة في وقت التشغيل.

// npm install env-varimport env from 'env-var';

export const config = { PORT: env.get('PORT').required().asPortNumber(), DB_HOST: env.get('DB_HOST').required().asString(), DEBUG: env.get('DEBUG').default('false').asBool(), API_KEYS: env.get('API_KEYS').asArray()};

الإيجابيات: واجهة برمجية بسيطة، محولات مدمجة (رقم، منفذ، قيمة منطقية، مصفوفة).
السلبيات: لا يوجد تكامل مع TypeScript على مستوى الأنواع — النتيجة لا تزال string | number | boolean.



الحلول الصناعية: convict و node-config



Convict

مكتبة لوصف مخطط التكوين مع التحقق من الصحة، والقيم الافتراضية، ودعم مصادر متعددة (ملفات، متغيرات بيئة، وسائط سطر الأوامر).

// npm install convict @types/convictimport convict from 'convict';

const config = convict({ env: { format: ['production', 'development', 'test'], default: 'development', env: 'NODE_ENV' }, server: { port: { format: 'port', default: 3000, env: 'PORT' } }, db: { host: { format: String, default: 'localhost', env: 'DB_HOST' } }});

config.validate({ allowed: 'strict' }); // سيطرح خطأ في حالة البيانات غير الصالحة

export default config;

ميزات convict:

  • تنسيقات مدمجة: port، email، url، int، nat (عدد طبيعي).
  • قراءة تلقائية من process.env وملفات JSON.
  • دعم المخططات المتداخلة.
  • عيب

توصيات