TypeScript अनुप्रयोगों का कॉन्फ़िगरेशन: सरल से जटिल तक
किसी भी आधुनिक अनुप्रयोग को लचीली और सुरक्षित सेटिंग्स की आवश्यकता होती है। चाहे वह API-कुंजियाँ हों, डेटाबेस कनेक्शन पैरामीटर, सर्वर पोर्ट या फीचर फ़्लैग — कॉन्फ़िगरेशन को कोड से अलग, आसानी से पढ़ने योग्य और स्टार्टअप पर मान्य होना चाहिए। TypeScript की दुनिया में, इस कार्य की अपनी विशेषताएँ हैं: कॉन्फ़िगरेशन की टाइपिंग ऑटो-कम्प्लीशन प्रदान करती है और रनटाइम त्रुटियों को रोकती है। इस लेख में, हम TypeScript अनुप्रयोगों के कॉन्फ़िगरेशन प्रबंधन के लिए सर्वोत्तम प्रथाओं, लोकप्रिय लाइब्रेरीज़ और टूल्स पर चर्चा करेंगे।
सीधे process.env का उपयोग क्यों नहीं करना चाहिए?
पहली नज़र में, process.env के माध्यम से एनवायरनमेंट वेरिएबल्स पढ़ना एक सरल समाधान लगता है। हालाँकि, इस दृष्टिकोण में महत्वपूर्ण कमियाँ हैं:
- टाइपिंग का अभाव: सभी मान स्ट्रिंग होते हैं, भले ही तार्किक रूप से वे संख्या या बूलियन मान हों।
- टाइपो का जोखिम:
DB_HOSTके बजायprocess.env.DB_HOTSलिखना आसान है औरundefinedप्राप्त करना। - वैलिडेशन का अभाव: यदि कोई अनिवार्य वेरिएबल सेट नहीं है, तो एप्लिकेशन सबसे अप्रत्याशित समय पर क्रैश होगा, न कि स्टार्टअप पर।
एक अच्छा कॉन्फ़िगरेशन इन सभी समस्याओं का समाधान करता है।
dotenv लाइब्रेरी और इसके TypeScript रैपर
.env फ़ाइलों को लोड करने के लिए डी-फैक्टो मानक dotenv लाइब्रेरी है। TypeScript के लिए, dotenv-flow या dotenv-expand का उपयोग करना सुविधाजनक है, जो कई एनवायरनमेंट (development, staging, production) का समर्थन करते हैं।
// इंस्टॉलेशन// npm install dotenv dotenv-expand
// config/env.tsimport dotenv from 'dotenv';import dotenvExpand from 'dotenv-expand';
const myEnv = dotenv.config({ path: `.env.${process.env.NODE_ENV || 'development'}` });dotenvExpand.expand(myEnv);इस फ़ंक्शन को कॉल करने के बाद, .env फ़ाइल के सभी वेरिएबल्स process.env के माध्यम से उपलब्ध होंगे, लेकिन हमारे पास अभी भी टाइप नहीं हैं।
Zod के साथ स्कीमा वैलिडेशन
Zod — TypeScript के लिए प्रथम श्रेणी के समर्थन के साथ घोषणात्मक स्कीमा वैलिडेशन के लिए एक शक्तिशाली लाइब्रेरी है। यह कॉन्फ़िगरेशन के लिए एकदम सही है:
// config/schema.tsimport { z } from 'zod';
const envSchema = z.object({ NODE_ENV: z.enum(['development', 'production', 'test']).default('development'), PORT: z.coerce.number().positive().default(3000), DATABASE_URL: z.string().url(), JWT_SECRET: z.string().min(32), REDIS_HOST: z.string().default('localhost'), REDIS_PORT: z.coerce.number().default(6379), FEATURE_NEW_UI: z .string() .transform((val) => val === 'true') .default('false'),});
export type EnvConfig = z.infer<typeof envSchema>;अब हम स्टार्टअप पर सुरक्षित रूप से एनवायरनमेंट को पार्स और मान्य कर सकते हैं:
// config/index.tsimport { envSchema, EnvConfig } from './schema';
let config: EnvConfig;
export function loadConfig(): EnvConfig { if (config) return config; // कैशिंग
const result = envSchema.safeParse(process.env); if (!result.success) { console.error('❌ अमान्य एनवायरनमेंट वेरिएबल्स:', result.error.flatten().fieldErrors); process.exit(1); } config = result.data; return config;}
export function getConfig(): EnvConfig { if (!config) throw new Error('कॉन्फ़िगरेशन लोड नहीं हुआ। पहले loadConfig() को कॉल करें।'); return config;}एप्लिकेशन कॉन्फ़िगरेशन प्रबंधन के लिए Conf लाइब्रेरी
यदि आपके एप्लिकेशन को न केवल पढ़ने बल्कि कॉन्फ़िगरेशन लिखने की भी आवश्यकता है (उदाहरण के लिए, उपयोगकर्ता सेटिंग्स, कैश), तो Sindre Sorhus के conf पर ध्यान दें। यह डेटा को JSON फ़ाइल में संग्रहीत करता है और पूरी तरह से टाइप किया गया है।
// इंस्टॉलेशन// npm install conf
import Conf from 'conf';
interface AppConfig { lastOp