تكوين تطبيقات 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. - دعم المخططات المتداخلة.
- عيب