Configuration des applications TypeScript : du simple au complexe
Toute application moderne nécessite une configuration flexible et sécurisée. Qu'il s'agisse de clés API, de paramètres de connexion à la base de données, de ports serveur ou de flags de fonctionnalités, la configuration doit être séparée du code, facile à lire et validée au démarrage. Dans le monde du TypeScript, cette tâche a ses particularités : le typage de la configuration offre l'autocomplétion et prévient les erreurs d'exécution. Dans cet article, nous analyserons les meilleures pratiques, les bibliothèques populaires et les outils de gestion de configuration pour les applications TypeScript.
Pourquoi ne pas utiliser process.env directement ?
À première vue, lire les variables d'environnement via process.env semble une solution simple. Cependant, cette approche présente des inconvénients majeurs :
- Absence de typage : toutes les valeurs sont des chaînes, même si logiquement ce devrait être un nombre ou un booléen.
- Risque de fautes de frappe : il est facile d'écrire
process.env.DB_HOTSau lieu deDB_HOSTet d'obtenirundefined. - Absence de validation : si une variable obligatoire n'est pas définie, l'application plantera au moment le plus inattendu, et non au démarrage.
Une configuration bien conçue résout tous ces problèmes.
La bibliothèque dotenv et ses wrappers TypeScript
Le standard de facto pour charger les fichiers .env est la bibliothèque dotenv. Pour TypeScript, il est pratique d'utiliser dotenv-flow ou dotenv-expand, qui prennent en charge plusieurs environnements (development, staging, production).
// Installation// 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);Après avoir appelé cette fonction, toutes les variables du fichier .env seront accessibles via process.env, mais nous n'avons toujours pas de types.
Validation de schéma avec Zod
Zod est une bibliothèque puissante pour la validation déclarative de schémas avec un support de premier ordre pour TypeScript. Elle est idéale pour la configuration :
// 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>;Nous pouvons désormais analyser et valider l'environnement en toute sécurité au démarrage :
// config/index.tsimport { envSchema, EnvConfig } from './schema';
let config: EnvConfig;
export function loadConfig(): EnvConfig { if (config) return config; // mise en cache
const result = envSchema.safeParse(process.env); if (!result.success) { console.error('❌ Variables d'environnement invalides :', result.error.flatten().fieldErrors); process.exit(1); } config = result.data; return config;}
export function getConfig(): EnvConfig { if (!config) throw new Error('Configuration non chargée. Appelez loadConfig() d'abord.'); return config;}La bibliothèque Conf pour la gestion de la configuration d'application
Si votre application nécessite non seulement la lecture mais aussi l'écriture de configuration (par exemple, paramètres utilisateur, cache), jetez un œil à conf de Sindre Sorhus. Elle stocke les données dans un fichier JSON et est entièrement typée.
// Installation// npm install conf
import Conf from 'conf';
interface AppConfig { lastOp Aussi dans la bibliothèque
ts-morph pour TypeScript : guide complet avec exemples
Crypto-js pour JavaScript (Node.js) : guide complet avec exemples
Nodemailer — envoi d'email en TypeScript
Travailler avec CSV en TypeScript : bibliothèques, analyse et génération de données
Clients Redis pour Kotlin : Lettuce, Redisson et Kredis