Konfiguration von TypeScript-Anwendungen: Überblick über Tools und Bibliotheken
Eine moderne TypeScript-Anwendung arbeitet selten isoliert. Sie muss wissen, mit welcher Datenbank sie sich verbinden soll, welchen Port sie verwenden soll, wo sich externe APIs befinden und wie sie sich in verschiedenen Umgebungen (Development, Staging, Production) verhalten soll. Eine durchdachte Konfiguration ist nicht nur das Speichern von Einstellungen, sondern eine ganze Disziplin, die Validierung, Typisierung und Sicherheit umfasst.
In diesem Artikel betrachten wir die wichtigsten Tools und Bibliotheken für die Konfigurationsverwaltung in TypeScript-Projekten, von einfachen Lösungen bis hin zu Industriestandards.
Warum ist eine separate Konfiguration notwendig?
Es gibt mehrere Ansätze zum Speichern von Einstellungen, und jeder hat Nachteile:
- Hardcodierung im Quellcode — verstößt gegen das 12-Factor-App-Prinzip, Konfiguration wird mit Code vermischt, Verhalten kann nicht ohne Neubuild geändert werden.
- Umgebungsvariablen (process.env) — Standardmethode, aber alle Werte sind Zeichenketten, es gibt keine Validierung, Tippfehler sind leicht möglich.
- JSON/YAML-Dateien — praktisch, aber sie müssen vorsichtig versioniert werden, um keine Geheimnisse in das Repository zu legen.
TypeScript fügt eine weitere Ebene hinzu: Wir möchten, dass die Konfiguration streng typisiert ist und Fehler bereits zur Kompilierzeit und nicht erst zur Laufzeit erkannt werden.
Bibliotheken für die Arbeit mit Umgebungsvariablen
dotenv
Die beliebteste Bibliothek zum Laden von Variablen aus .env-Dateien. In TypeScript-Projekten wird sie fast immer verwendet.
// npm install dotenv @types/dotenvimport dotenv from 'dotenv';
dotenv.config(); // lädt .env in process.env
console.log(process.env.PORT); // '3000' — ZeichenketteBesonderheiten:
- Funktioniert mit allen Frameworks (Express, NestJS, Next.js).
- Unterstützt mehrere Dateien (
.env.local,.env.production). - Führt keine Validierung durch — nur das Laden.
env-var
Ein Aufsatz auf process.env, der Validierung und Typumwandlung direkt zur Laufzeit hinzufügt.
// 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()};Vorteile: einfache API, integrierte Konverter (Zahl, Port, Boolean, Array).
Nachteile: keine Integration mit TypeScript auf Typebene — das Ergebnis ist immer noch string | number | boolean.
Industrielle Lösungen: convict und node-config
Convict
Bibliothek zur Beschreibung eines Konfigurationsschemas mit Validierung, Standardwerten und Unterstützung verschiedener Quellen (Dateien, env, Kommandozeilenargumente).
// 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' }); // wirft einen Fehler bei ungültigen Daten
export default config;Besonderheiten von convict:
- Integrierte Formate:
port,email,url,int,nat(natürliche Zahl). - Automatisches Lesen aus
process.envund JSON-Dateien. - Unterstützung für verschachtelte Schemata.
- Nachteil
Auch in der Bibliothek
Anvil für Kotlin: Vollständiges Tutorial mit Codebeispielen
Testen in JavaScript (Node.js): Frameworks und Werkzeuge
Testen in Go (Golang): Frameworks und Werkzeuge – vollständiger Leitfaden
Redis (ioredis) für JavaScript (Node.js): Komplettguide mit Beispielen
Autorisierung und Authentifizierung in C++: Bibliotheken, Beispiele und Implementierung