Entfernen ungenutzter Dateien und Abhängigkeiten mit Knip
Jedes JavaScript- und TypeScript-Projekt sammelt mit der Zeit Ballast an: eine Abhängigkeit, die für ein schnelles Experiment installiert wurde, eine Utility-Datei, die nach einem Refactoring übrig geblieben ist, eine exportierte Funktion, die niemand mehr importiert. Einzeln betrachtet wirken diese harmlos. In ihrer Gesamtheit verlangsamen sie Builds, blähen node_modules auf, erzeugen Rauschen bei Sicherheitswarnungen und erschweren die Navigation in Codebasen.
Die traditionelle Reaktion ist ein manuelles Audit: per grep nach Paketnamen suchen, Dateireferenzen prüfen, package.json von Hand abgleichen. Das funktioniert, skaliert aber nicht. Genau hier kommt Knip ins Spiel.
Die wichtigsten Erkenntnisse
- Ungenutzte Abhängigkeiten und toter Code verlängern Build-Zeiten, blähen Bundles auf und verursachen Sicherheits- und Lizenzrauschen.
- Knip analysiert dein gesamtes Repository wie ein Linter auf Projektebene und meldet ungenutzte Dateien, Exporte, Abhängigkeiten und nicht aufgelistete Importe.
- Das Flag
--fixwendet automatische Aufräumarbeiten an, während--allow-remove-filesdies auf das Löschen ungenutzter Dateien ausweitet. - Knip in der CI auszuführen hilft dabei, die Ansammlung von totem Code zu verhindern, und ergänzt ESLint sowie deinen Formatter.
Warum sich das Beheben ungenutzter Abhängigkeiten und toten Codes lohnt
Ungenutzte Pakete in package.json sind nicht nur kosmetisches Rauschen. Sie:
- Erhöhen die Installationszeit und den Plattenverbrauch von
node_modules - Können in Produktions-Bundles landen, wenn dein Bundler sie nicht ordnungsgemäß per Tree-Shaking entfernt
- Lösen Fehlalarme in Tools wie Dependabot aus
- Können restriktive Lizenzen mitbringen, die technisch gesehen auch für dein Projekt gelten
- Bringen transitive Abhängigkeiten mit denselben Problemen mit sich
Toter Code verursacht ähnliche Kosten. Ungenutzte Exporte und nicht referenzierte Dateien erschweren das Verständnis dessen, was eine Codebasis tatsächlich tut, und verlangsamen Linter und Type-Checker, die sie ohnehin verarbeiten müssen.
Was Knip anders macht
Tools wie depcheck und ts-prune haben Teile dieses Problems adressiert, doch beide Projekte wurden 2025 archiviert. Knip ist als moderner Ersatz entstanden, der Abhängigkeits-, Export- und Dateianalyse in einem einzigen, aktiv gepflegten Tool kombiniert.
Betrachte Knip als Linter auf Projektebene. Während ESLint einzelne Dateien prüft, analysiert Knip das gesamte Repository: Einstiegspunkte, Import-Graphen, Exporte und package.json zusammen. Es meldet ungenutzte Dateien, ungenutzte Exporte, ungenutzte Abhängigkeiten und Pakete, die zwar importiert werden, aber in package.json fehlen.
Knip funktioniert mit npm, pnpm, Yarn und Bun und benötigt zur Ausführung Node.js 20.19+ oder Bun.
In fünf Minuten loslegen
Initialisiere Knip in deinem Projekt mit:
npm init @knip/config
Dies erstellt eine knip.json-Konfigurationsdatei mit sinnvollen Standardeinstellungen. Anschließend führst du die Analyse aus:
npx knip
Knip gibt einen Bericht aus, der nach Problemtyp gruppiert ist: ungenutzte Dateien, ungenutzte Exporte, ungenutzte Abhängigkeiten und nicht aufgelistete Abhängigkeiten. Beim ersten Lauf in einem älteren Projekt kann die Liste lang werden – das ist zu erwarten.
Discover how at OpenReplay.com.
Fixes sicher anwenden
Sobald du den Bericht geprüft hast und er korrekt aussieht, kann Knip nachvollziehbare automatische Korrekturen anwenden:
npx knip --fix
Damit werden export-Schlüsselwörter aus ungenutzten Exporten entfernt, package.json aufgeräumt und Re-Exporte sowie TypeScript-Enum-Mitglieder behandelt. Um zusätzlich ungenutzte Dateien zu löschen:
npx knip --fix --allow-remove-files
Überprüfe Änderungen immer in Git, bevor du sie committest. Knip ist absichtlich konservativ ausgelegt, aber Auto-Fix verändert reale Dateien. Ein kurzes git diff vor dem Staging ist eine gute Angewohnheit.
Du kannst auch gezielt bestimmte Problemtypen ansteuern, um Änderungen klein und überprüfbar zu halten:
npx knip --fix-type dependencies
npx knip --fix-type exports,types
Wenn Knip etwas Hilfe braucht
Knip ist keine perfekte Blackbox. Einige Situationen erfordern manuelle Konfiguration:
- Dynamische Importe (
import(someVariable)) können statisch nicht aufgelöst werden - Framework-Konventionen (Next.js-Page-Dateien, Vite-Virtual-Modules) benötigen möglicherweise Plugin-Konfigurationen oder Ignore-Regeln
- Generierte Dateien sollten in der Regel von der Analyse ausgeschlossen werden
- Monorepos funktionieren von Haus aus gut, aber workspace-übergreifende Referenzen erfordern manchmal explizite Konfiguration
Wenn du False Positives siehst, füge einen ignore- oder ignoreDependencies-Eintrag in knip.json hinzu, anstatt ganze Analysebereiche zu deaktivieren.
Aufräumen zur Gewohnheit machen
Den größten Nutzen entfaltet Knip nicht als einmaliges Audit, sondern wenn es regelmäßig ausgeführt wird. Binde es neben deinem Linter und Type-Checker in deine CI-Pipeline ein:
npx knip --reporter compact
Ein sauberer Bericht bei jedem Pull Request hilft dabei, zu verhindern, dass sich toter Code überhaupt erst ansammelt. Kombiniere Knip mit ESLint (für ungenutzte Variablen innerhalb von Dateien) und deinem bevorzugten Formatter, und du hast einen soliden, automatisierten Wartungskreislauf, der deine JavaScript- und TypeScript-Projekte schlank hält – ohne manuelle Detektivarbeit.
Fazit
Knip verwandelt die mühsame Aufgabe, ungenutzte Dateien, Exporte und Abhängigkeiten aufzuspüren, in einen wiederholbaren, automatisierten Schritt. Indem du Aufräumarbeiten als Teil deines regulären Workflows behandelst statt als gelegentlichen Frühjahrsputz, hältst du dein Projekt schlank, deine Builds schnell und deine Abhängigkeitsfläche klein. Beginne mit einem einzigen npx knip-Lauf, integriere die Ergebnisse in deine CI und lass das Tool die Detektivarbeit erledigen, die du bisher von Hand erledigt hast.
FAQs
Ja, Knip meldet standardmäßig nur Probleme und nimmt keine Änderungen vor, sofern du nicht das Flag --fix übergibst. Führe es zuerst aus, um den Bericht zu prüfen, und wende Fixes anschließend schrittweise mit --fix-type an, um jeweils eine Kategorie gezielt anzugehen. Überprüfe immer den Git-Diff vor dem Commit, insbesondere bei Verwendung von --allow-remove-files.
Knip vereint die Aufgaben beider Tools in einem einzigen, aktiv gepflegten Paket. Depcheck fokussiert sich auf Abhängigkeiten und ts-prune auf ungenutzte TypeScript-Exporte, aber Knip analysiert Dateien, Exporte und Abhängigkeiten gemeinsam über Workspaces hinweg und liefert dadurch genauere Ergebnisse für moderne Projekte.
False Positives entstehen meist durch dynamische Importe, Framework-Konventionen oder generierte Dateien, die Knip statisch nicht auflösen kann. Prüfe, ob ein Knip-Plugin für dein Framework existiert, und füge anschließend für die verbleibenden Fälle ignore- oder ignoreDependencies-Einträge in knip.json hinzu. Vermeide es, ganze Analysebereiche zu deaktivieren, um die Abdeckung zu erhalten.
Ja, und genau dort entfaltet es den größten Nutzen. Füge npx knip --reporter compact zu deiner CI-Pipeline hinzu, damit jeder Pull Request auf neuen toten Code geprüft wird. In Kombination mit ESLint und deinem Formatter entsteht so ein automatisierter Wartungskreislauf, der hilft, die Ansammlung ungenutzter Dateien und Abhängigkeiten zwischen Releases zu verhindern.
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.