Introduction : Pourquoi TypeScript peut-il être lent ?
TypeScript est un outil puissant qui ajoute le typage statique à JavaScript. Cependant, les développeurs constatent souvent que les applications TypeScript "prêtes à l'emploi" fonctionnent plus lentement que le JS pur. Les principales raisons sont une transpilation excessive, une mauvaise configuration du compilateur et des patterns de code non optimaux. Dans cet article, nous allons examiner les méthodes pratiques d'optimisation qui permettront d'accélérer à la fois le processus de build et l'exécution de votre application.
1. Profilage et recherche des goulots d'étranglement
Avant d'optimiser quoi que ce soit, il faut comprendre ce qui ralentit exactement. Utilisez les outils intégrés du navigateur et de Node.js.
1.1. Performances de Chrome DevTools
Enregistrez le profil d'exécution de l'application. Faites attention aux tâches longues (Long Tasks) et aux appels fréquents du ramasse-miettes (GC). Le code TypeScript après compilation est du JavaScript ordinaire, donc toutes les méthodes de profilage standard fonctionnent.
1.2. Analyse du temps de build (tsc --generateTrace)
Si la compilation elle-même est lente, utilisez le flag --generateTrace :
tsc --generateTrace trace_outputOuvrez ensuite le fichier trace_output/trace.json dans Chrome à l'adresse chrome://tracing. Vous verrez quels fichiers prennent le plus de temps à compiler. Il s'agit souvent de grandes bibliothèques ou de fichiers avec des imports redondants.
2. Configuration de tsconfig.json pour une vitesse maximale
Une mauvaise configuration est le principal ennemi de la performance. Examinons les options clés.
2.1. strict: true — ne vous précipitez pas
Le mode strict active toutes les vérifications de type strictes. Cela ralentit la compilation. Pour un build de production, utilisez :
{ "compilerOptions": { "strict": false, "noImplicitAny": true, "strictNullChecks": true }}Ces deux options couvrent 90% des erreurs, mais fonctionnent plus rapidement que le mode strict complet.
2.2. Options pour accélérer le build
incremental: true— active la compilation incrémentielle. TypeScript enregistre les informations du build précédent et ne recompile que les fichiers modifiés.skipLibCheck: true— désactive la vérification des types dans les fichiers de déclaration (.d.ts). Cela donne un gain de vitesse significatif, surtout si vous utilisez beaucoup de bibliothèques tierces.isolatedModules: true— permet d'utiliser des transpileurs plus rapides (par exemple, esbuild) au lieu de tsc.
Exemple de configuration optimisée pour le développement :
{ "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. Optimisation de l'exécution : types et structures de données
Les types TypeScript disparaissent après la compilation, mais leur "empreinte" subsiste sous forme de code généré par le compilateur.
3.1. Évitez les types conditionnels complexes dans l'exécution
Les conditional types complexes peuvent générer beaucoup de code. Utilisez plutôt des types union simples :
// Mauvais : type conditionnel complexetype ResponseType<T> = T extends string ? { data: string } : { data: number };function handleResponse<T>(value: T): ResponseType<T> { ... }
// Bon : union simpletype ResponseType = { data: string } | { data: number };function handleResponse(value: string | number): ResponseType { ... }3.2. Utilisez as const pour les constantes
Cela aide TypeScript à déduire des types plus précis, ce qui réduit le nombre de vérifications :
const COLORS = ['red', 'green',