Einleitung: Warum kann TypeScript langsam sein?
TypeScript ist ein leistungsstarkes Werkzeug, das JavaScript um statische Typisierung erweitert. Allerdings stellen Entwickler oft fest, dass TypeScript-Anwendungen "von Haus aus" langsamer laufen als reines JS. Die Hauptgründe sind übermäßige Transpilierung, falsche Compiler-Konfiguration und ineffiziente Codemuster. In diesem Artikel behandeln wir praktische Optimierungsmethoden, die sowohl den Build-Prozess als auch die Laufzeit Ihrer Anwendung beschleunigen.
1. Profiling und Identifikation von Engpässen
Bevor Sie etwas optimieren, müssen Sie verstehen, was genau die Leistung beeinträchtigt. Nutzen Sie die integrierten Tools des Browsers und von Node.js.
1.1. Chrome DevTools Performance
Zeichnen Sie ein Ausführungsprofil Ihrer Anwendung auf. Achten Sie auf lange Aufgaben (Long Tasks) und häufige Aufrufe des Garbage Collectors (GC). TypeScript-Code ist nach der Kompilierung normales JavaScript, daher funktionieren alle Standard-Profiling-Methoden.
1.2. Analyse der Build-Zeit (tsc --generateTrace)
Wenn die Kompilierung selbst langsam ist, verwenden Sie das Flag --generateTrace:
tsc --generateTrace trace_outputÖffnen Sie dann die Datei trace_output/trace.json in Chrome unter chrome://tracing. Sie sehen, welche Dateien am längsten kompilieren. Oft sind dies große Bibliotheken oder Dateien mit übermäßigen Importen.
2. Konfiguration der tsconfig.json für maximale Geschwindigkeit
Eine falsche Konfiguration ist der Hauptfeind der Leistung. Betrachten wir die wichtigsten Optionen.
2.1. strict: true – nicht übereilen
Der Modus strict aktiviert alle strengen Typprüfungen. Dies verlangsamt die Kompilierung. Verwenden Sie für Produktions-Builds:
{ "compilerOptions": { "strict": false, "noImplicitAny": true, "strictNullChecks": true }}Diese beiden Optionen decken 90% der Fehler ab, arbeiten aber schneller als das vollständige strict.
2.2. Optionen zur Beschleunigung des Builds
incremental: true– aktiviert die inkrementelle Kompilierung. TypeScript speichert Informationen über den vorherigen Build und kompiliert nur geänderte Dateien neu.skipLibCheck: true– deaktiviert die Typprüfung in Deklarationsdateien (.d.ts). Dies bringt einen deutlichen Geschwindigkeitsvorteil, insbesondere bei vielen Drittanbieter-Bibliotheken.isolatedModules: true– ermöglicht die Verwendung schnellerer Transpiler (z. B. esbuild) anstelle von tsc.
Beispiel einer optimierten Konfiguration für die Entwicklung:
{ "compilerOptions": { "target": "ES2020", "module": "ESNext", "moduleResolution": "node", "incremental": true, "skipLibCheck": true, "strict": false, "noImplicitAny": true, "strictNullChecks": true, "outDir": "./dist" }, "include": ["src/**/*"], "exclude": ["node_modules", "**/*.test.ts"]}3. Laufzeitoptimierung: Typen und Datenstrukturen
TypeScript-Typen verschwinden nach der Kompilierung, aber ihr "Abdruck" bleibt in Form des vom Compiler generierten Codes erhalten.
3.1. Vermeiden Sie komplexe bedingte Typen zur Laufzeit
Komplexe conditional types können viel Code generieren. Verwenden Sie stattdessen einfache Union-Typen:
// Schlecht: komplexer bedingter Typtype ResponseType<T> = T extends string ? { data: string } : { data: number };function handleResponse<T>(value: T): ResponseType<T> { ... }
// Gut: einfacher Union-Typtype ResponseType = { data: string } | { data: number };function handleResponse(value: string | number): ResponseType { ... }3.2. Verwenden Sie as const für Konstanten
Dies hilft TypeScript, genauere Typen abzuleiten, was die Anzahl der Prüfungen reduziert:
const COLORS = ['red', 'green',