Wie bereinige ich den Ordner node_modules von Paketen, die sich nicht in package.json befinden?

338

Angenommen, ich installiere Projektpakete, bei npm installdenen package.jsonnach zu installierenden Modulen gesucht wird. Nach einer Weile sehe ich, dass ich kein bestimmtes Modul benötige und entferne dessen Abhängigkeit von package.json. Dann entferne ich einige andere Module aus, package.jsonweil sie nicht mehr benötigt werden und andere durch Alternativen ersetzt werden.

Jetzt möchte ich den node_modulesOrdner bereinigen, damit nur die in aufgelisteten Module dort package.jsonbleiben und der Rest gehen muss, so etwas wie npm clean. Ich weiß, dass ich sie manuell entfernen kann, hätte aber gerne eine nette, einsatzbereite Zuckerfunktionalität dafür.

Sergei Basharov
quelle

Antworten:

407

Ich denke du suchst npm prune

npm prune [<name> [<name ...]]

Dieser Befehl entfernt "fremde" Pakete. Wenn ein Paketname angegeben wird, werden nur Pakete entfernt, die mit einem der angegebenen Namen übereinstimmen.

Fremdpakete sind Pakete, die nicht in der Abhängigkeitsliste des übergeordneten Pakets aufgeführt sind.

Siehe die Dokumente: https://docs.npmjs.com/cli/prune

David Sherret
quelle
1
Soweit ich weiß, befinden sich in der neuen NPM-Version alle Abhängigkeiten im node_modulesStammordner und nicht wie zuvor, wo für jede Abhängigkeit ihre eigenen Abhängigkeiten in ihren eigenen node_modulesOrdnern installiert wurden. Mit unzähligen Kopien derselben Abhängigkeiten ... so wird npm pruneberücksichtigt dies? weil diese tiefen Abhängigkeiten nicht auf den Hauptteil package.jsonIhres Projekts geschrieben sind. Prune muss rekursiv aussehen.
vsync
2
@vsync Die Reduzierung der Duplizierung wird mit dem Befehl npm dedupe docs.npmjs.com/cli/dedupe erreicht . Es wird versucht, den Knotenbaum zu vereinfachen, indem Abhängigkeiten nach oben verschoben werden.
Knaos
Ich habe gesehen, dass NPM Prune nicht in der Lage ist, Dinge zu löschen, die normalerweise schief gehen, wenn in meinem Unternehmens-Repository etwas kaputt ist. Dann muss ich rm-rf. Es wäre schön, wenn es einen Befehl "Alles wegblasen, dann alles auf einmal
reget
209

Sie können Ihren Ordner node_modules / entfernen und dann die Abhängigkeiten von package.json neu installieren.

rm -rf node_modules/
npm install

Dies würde alle installierten Pakete im aktuellen Ordner löschen und nur die Abhängigkeiten von package.json installieren. Wenn die Abhängigkeiten zuvor installiert wurden, versucht npm, die zwischengespeicherte Version zu verwenden, um zu vermeiden, dass die Abhängigkeit ein zweites Mal heruntergeladen wird.

Adamduren
quelle
4
Ja, ich weiß, dass ich diese Methode anwenden kann, aber ich bin gespannt, warum es dafür noch keine elegantere Lösung gibt.
Sergei Basharov
Gibt es wirklich keinen npm-Befehl zum Löschen von node_modules außer dem Löschen des Ordners?
Anders
4
Auf der Windows-Plattform schlägt dies beim Löschen von node_modules über den Explorer oder die Befehlszeile fehl (da der Pfad zu einigen Modulen länger als 256 ist). Es sollte den Befehl npm geben, um dies sauberer zu machen.
Ravi Kumar
9
Oder unter rmdir node_modules /s /qWindows. superuser.com/a/179661/440976
Wédney Yuri
5
Ich denke, dieser Antwort fehlt ein sehr wichtiger Punkt: Wenn Sie durch den Datenverkehr eingeschränkt sind (dh Sie haben die teure Verbindung pro Megabyte, die wie ein Mobiltelefon bezahlt wird) und Sie viele Module haben, kann dies Sie kosten , während die pruneOption erfordert, dass Sie überhaupt eine Internetverbindung haben.
Ivan Kolmychek
102

Aufgrund der Verschachtelung der Ordner kann Windows den Ordner nicht löschen, da sein Name zu lang ist. Um dies zu lösen, installieren Sie RimRaf:

npm install rimraf -g

rimraf node_modules
user3844078
quelle
8
Oder einfachrm -rf node_modules
kappaallday
16
rm -rf node_modulesfunktioniert nicht unter Windows. Sehen Sie diese Lösung: superuser.com/a/179661/440976
Wédney Yuri
1
Win7 x64 Rimraf hat großartig funktioniert durch PowerShell .. danke
Gorelative
Beste Lösung für Windows 10 64-Bit über CMD
Matt Cromwell
rm -rf node_modules funktionierte nicht für mich unter Windows 10. Aber rimraf funktionierte für mich
ssmsnet
24

einfach einfach laufen lassen

rm -r node_modules

Tatsächlich können Sie damit jeden Ordner löschen.

wie rm -r AnyFolderWhichIsNotDeletableFromShiftDeleteOrDelete .

Öffne einfach den Gitbash Verschiebung zum Stammverzeichnis des Ordners und führen Sie diesen Befehl aus

Hoffe das wird helfen.

Ajay Kotnala
quelle
2
Funktioniert nicht, ich erhalte den Fehler "Erlaubnis verweigert" (mit gitbash.
drake035
3
Öffnen Sie Gitbash im Administratormodus. Ich denke, das wird helfen. oder ändern Sie die Einstellungen für die
Ordnerberechtigungsstufe
3
Dies würde alle Pakete löschen . Das OP sagt eindeutig "Ich möchte den Ordner node_modules bereinigen, damit nur die in package.json aufgelisteten Module dort bleiben".
Boaz - Stellen Sie Monica
In diesem Fall, mein Freund, können Sie einfach "npm uninstall package_name" oder --save as sufix ausführen, um den Eintrag auch aus der Datei package.json zu löschen. npm deinstalliere Paketname (lösche Paket) npm deinstalliere Paketname --save (lösche Paket und entferne den Eintrag aus den Abhängigkeiten in Paket json) npm deinstalliere Paketname --save-dev (lösche Paket und entferne den Eintrag aus devdependencies in Paket json)
Ajay Kotnala
22

Installieren Sie zuerst rimraf global

npm install rimraf -g

Gehen Sie mit cmd zum Pfad, in dem sich Ihr Ordner node_modules befindet, und wenden Sie den folgenden Befehl an

rimraf node_modules
Ankit Parmar
quelle
Gute Antwort, aber die Installation eines Pakets zur Deinstallation anderer ist keine gute Idee. npm pruneist eine ideale Lösung.
Binayak Gouri Shankar
Ja, aber wenn Sie den Ordner node_module aus Ihrem Projekt entfernen möchten, ist dies der beste und einfachste Weg.
Ankit Parmar
9

Haben Sie versucht, npm Prune?

Es sollte alles deinstallieren, was nicht in Ihrer Paketdatei aufgeführt ist

https://npmjs.org/doc/cli/npm-prune.html

Christoffer Bo Petersen
quelle
9

ab Version 6.5.0 unterstützt npm den Befehl clean-install, alle Pakete hart zu aktualisieren

Giuseppe B.
quelle
1
Genau das brauchte ich. Wenn ich den Knoten aktualisiere, passiert als erstes "Sie haben anscheinend Ihre Umgebung geändert, seit Sie 'npm install' ausgeführt haben". Da ich bereits in der Konsole bin, ist es am einfachsten, eine Neuinstallation durchzuführen, anstatt zuerst Ordner usw. zu löschen.
Jarrod McGuire
3

Ich habe einige Zeilen in package.json hinzugefügt:

"scripts": {
  ...
  "clean": "rmdir /s /q node_modules",
  "reinstall": "npm run clean && npm install",
  "rebuild": "npm run clean && npm install && rmdir /s /q dist && npm run build --prod",
  ...
}

Wenn Sie nur möchten, cleankönnen Sie diese rimraf node_modulesoder verwenden rm -rf node_modules.

Es funktioniert gut

Amitesh Singh
quelle
1

Der beste Artikel, den ich darüber gefunden habe, ist dieser: https://trilon.io/blog/how-to-delete-all-nodemodules-recursively

Alles von der Konsole aus und einfach von jedem Ordnerpunkt aus auszuführen.

Aber als Zusammenfassung des Artikels, dieser Befehl, um die Größe für jeden node_moduleOrdner in verschiedenen Projekten zu finden.

find . -name "node_modules" -type d -prune -print | xargs du -chs

Und um sie tatsächlich zu entfernen:

find . -name 'node_modules' -type d -prune -print -exec rm -rf '{}' \;

Der Artikel enthält auch Anweisungen für die Windows-Shell.

robertovg
quelle
0

Entfernen / Bearbeiten Sie die Pakete, die in package-lock.json nicht benötigt werden (Paketnamen werden unter Abhängigkeiten und devDependencies geschrieben) und dann

npm install

Fakrudeen
quelle
-2

Verwenden Sie den folgenden Befehl anstelle von npm install

npm ci
Jasmin Mistry
quelle
npm ci installiert die in shrinkwrap.json
LuckyLikey