Suppression des fichiers et dépendances inutilisés avec Knip
Tout projet JavaScript et TypeScript accumule du fouillis au fil du temps : une dépendance installée pour une expérimentation rapide, un fichier utilitaire oublié après un refactoring, une fonction exportée que plus personne n’importe. Pris isolément, ces éléments semblent inoffensifs. Mais collectivement, ils ralentissent les builds, font enfler node_modules, génèrent du bruit en matière de sécurité et rendent les bases de code plus difficiles à parcourir.
La réponse traditionnelle consiste à effectuer un audit manuel : grep sur les noms de paquets, recherche des références de fichiers, vérification manuelle de package.json. Cela fonctionne, mais ne passe pas à l’échelle. C’est ici qu’intervient Knip.
Points clés à retenir
- Les dépendances inutilisées et le code mort augmentent les temps de build, alourdissent les bundles et créent du bruit en matière de sécurité et de licences.
- Knip analyse l’intégralité de votre dépôt à la manière d’un linter au niveau projet, signalant les fichiers, exports, dépendances inutilisés et les imports non déclarés.
- Le flag
--fixapplique des corrections automatiques, tandis que--allow-remove-filesétend cela à la suppression des fichiers inutilisés. - Exécuter Knip dans la CI aide à empêcher l’accumulation de code mort et complète ESLint ainsi que votre formateur.
Pourquoi il vaut la peine de corriger les dépendances inutilisées et le code mort
Les paquets inutilisés dans package.json ne sont pas qu’un simple bruit cosmétique. Ils :
- Allongent le temps d’installation et l’espace disque occupé par
node_modules - Peuvent se retrouver dans les bundles de production si votre bundler ne les élimine pas correctement par tree-shaking
- Déclenchent de fausses alertes de sécurité dans des outils comme Dependabot
- Peuvent comporter des licences restrictives qui s’appliquent techniquement à votre projet
- Entraînent des dépendances transitives porteuses des mêmes problèmes
Le code mort engendre des coûts similaires. Les exports inutilisés et les fichiers non référencés rendent plus difficile la compréhension de ce que fait réellement une base de code, et ils ralentissent les linters et vérificateurs de types qui doivent malgré tout les traiter.
Ce que Knip fait différemment
Des outils comme depcheck et ts-prune répondaient à une partie de ce problème, mais ces deux projets ont été archivés en 2025. Knip est apparu comme un remplacement moderne combinant l’analyse des dépendances, des exports et des fichiers dans un seul outil activement maintenu.
Considérez Knip comme un linter au niveau du projet. Là où ESLint vérifie des fichiers individuels, Knip analyse l’intégralité du dépôt : points d’entrée, graphes d’import, exports et package.json dans leur ensemble. Il signale les fichiers inutilisés, les exports inutilisés, les dépendances inutilisées, ainsi que les paquets importés mais absents de package.json.
Knip fonctionne avec npm, pnpm, Yarn et Bun, et nécessite Node.js 20.19+ ou Bun pour s’exécuter.
Démarrer en cinq minutes
Initialisez Knip dans votre projet avec :
npm init @knip/config
Cela crée un fichier de configuration knip.json avec des valeurs par défaut raisonnables. Lancez ensuite l’analyse :
npx knip
Knip produit un rapport regroupé par type de problème : fichiers inutilisés, exports inutilisés, dépendances inutilisées et dépendances non déclarées. Lors d’un premier passage sur un projet ancien, la liste peut être longue — c’est attendu.
Discover how at OpenReplay.com.
Appliquer les corrections en toute sécurité
Une fois que vous avez examiné le rapport et qu’il vous semble exact, Knip peut appliquer des corrections automatiques vérifiables :
npx knip --fix
Cela supprime les mots-clés export des exports inutilisés, nettoie package.json et gère les ré-exports ainsi que les membres d’enum TypeScript. Pour également supprimer les fichiers inutilisés :
npx knip --fix --allow-remove-files
Examinez toujours les modifications dans Git avant de committer. Knip est conservateur par conception, mais l’auto-fix modifie de vrais fichiers. Un rapide git diff avant le staging est une bonne habitude.
Vous pouvez aussi cibler des types de problèmes spécifiques pour limiter l’ampleur des modifications et faciliter leur revue :
npx knip --fix-type dependencies
npx knip --fix-type exports,types
Quand Knip a besoin d’un coup de pouce
Knip n’est pas une boîte noire parfaite. Quelques situations nécessitent une configuration manuelle :
- Les imports dynamiques (
import(someVariable)) ne peuvent pas être résolus statiquement - Les conventions des frameworks (fichiers de pages Next.js, modules virtuels Vite) peuvent nécessiter une configuration via plugin ou des règles d’exclusion
- Les fichiers générés doivent généralement être exclus de l’analyse
- Les monorepos fonctionnent bien d’emblée, mais les références entre workspaces nécessitent parfois une configuration explicite
Si vous constatez des faux positifs, ajoutez une entrée ignore ou ignoreDependencies dans knip.json plutôt que de désactiver des sections entières de l’analyse.
Faire du nettoyage une habitude
L’usage le plus efficace de Knip n’est pas l’audit ponctuel — c’est son exécution régulière. Ajoutez-le à votre pipeline CI aux côtés de votre linter et de votre vérificateur de types :
npx knip --reporter compact
Un rapport propre à chaque pull request permet d’empêcher l’accumulation de code mort dès le départ. Associez Knip à ESLint (pour les variables inutilisées au sein des fichiers) et au formateur de votre choix, et vous obtenez une boucle de maintenance automatisée et solide qui maintient vos projets JavaScript et TypeScript sobres, sans travail d’enquête manuel.
Conclusion
Knip transforme la tâche fastidieuse de traquer les fichiers, exports et dépendances inutilisés en une étape reproductible et automatisée. En intégrant le nettoyage à votre flux de travail régulier plutôt qu’en grand ménage de printemps occasionnel, vous gardez votre projet sobre, vos builds rapides et votre surface de dépendances réduite. Commencez par un simple npx knip, intégrez les résultats à votre CI, et laissez l’outil mener l’enquête que vous faisiez auparavant à la main.
FAQ
Oui, Knip ne fait que signaler les problèmes par défaut et n'apporte aucune modification tant que vous ne passez pas le flag --fix. Lancez-le d'abord pour examiner le rapport, puis appliquez les corrections de manière incrémentale en utilisant --fix-type pour cibler une catégorie à la fois. Examinez toujours le diff Git avant de committer, notamment en utilisant --allow-remove-files.
Knip combine les responsabilités des deux outils dans un seul paquet activement maintenu. Depcheck se concentre sur les dépendances et ts-prune sur les exports TypeScript inutilisés, mais Knip analyse les fichiers, exports et dépendances conjointement à travers les workspaces, produisant des résultats plus précis pour les projets modernes.
Les faux positifs proviennent généralement d'imports dynamiques, de conventions de framework ou de fichiers générés que Knip ne peut pas résoudre statiquement. Vérifiez s'il existe un plugin Knip pour votre framework, puis ajoutez des entrées ignore ou ignoreDependencies dans knip.json pour les cas restants. Évitez de désactiver des sections entières de l'analyse afin de préserver la couverture.
Oui, et c'est là qu'il apporte le plus de valeur. Ajoutez npx knip --reporter compact à votre pipeline CI afin que chaque pull request soit vérifiée pour détecter le nouveau code mort. Combiné à ESLint et à votre formateur, cela crée une boucle de maintenance automatisée qui aide à empêcher l'accumulation de fichiers et de dépendances inutilisés entre les releases.
Understand every bug
Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.