Jak wyczyścić folder node_modules pakietów, których nie ma w pliku package.json?

338

Załóżmy, że instaluję pakiety projektów, npm installktóre sprawdzają package.jsonmoduły do ​​zainstalowania. Po chwili widzę, że nie potrzebuję jakiegoś konkretnego modułu i usuwam jego zależność package.json. Następnie usuwam niektóre inne moduły, package.jsonponieważ nie są już potrzebne, a inne są zastępowane alternatywnymi.

Teraz chcę wyczyścić node_modulesfolder, aby pozostały tylko wymienione moduły, package.jsona reszta musiała przejść, coś w rodzaju npm clean. Wiem, że mogę je usunąć ręcznie, ale chciałbym mieć jakąś przyjemną gotową do użycia funkcję cukru.

Siergiej Baszarow
źródło

Odpowiedzi:

407

Myślę, że szukasz npm prune

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

To polecenie usuwa „obce” pakiety. Jeśli podano nazwę pakietu, usuwane są tylko pakiety pasujące do jednej z dostarczonych nazw.

Zewnętrzne pakiety to pakiety, które nie są wymienione na liście zależności pakietów nadrzędnych.

Zobacz dokumenty: https://docs.npmjs.com/cli/prune

David Sherret
źródło
1
O ile mi wiadomo, w nowej wersji NPM wszystkie zależności znajdują się w node_modulesfolderze głównym , a nie jak poprzednio, gdzie każda zależność miała swoje własne zależności instalowane w swoich node_modulesfolderach .. z niezliczonymi kopiami tych samych zależności ... więc npm prunebierze to pod uwagę? ponieważ te głębokie zależności nie są zapisane w głównym package.jsonprojekcie. śliwka musi wyglądać rekurencyjnie.
vsync,
2
@vsync Zmniejszenie duplikacji osiąga się za pomocą polecenia npm dedupe docs.npmjs.com/cli/dedupe . Próbuje uprościć drzewo węzłów, przenosząc zależności w górę drzewa.
knaos
Widziałem, że śliwki NPM nie usuwają rzeczy, które zwykle psują się, gdy w moim repozytorium korporacyjnym coś jest nie tak. Potem muszę rm-rf. Byłoby miło, gdyby doszło do „uderzenia we wszystkim, a następnie przywrócenia wszystkiego za jednym zamachem”
ggb667
210

Możesz usunąć folder node_modules /, a następnie ponownie zainstalować zależności z pliku package.json.

rm -rf node_modules/
npm install

Spowodowałoby to usunięcie wszystkich zainstalowanych pakietów w bieżącym folderze i zainstalowanie tylko zależności z pliku package.json. Jeśli zależności zostały wcześniej zainstalowane, npm spróbuje użyć wersji z pamięci podręcznej, unikając ponownego pobierania zależności.

adamduren
źródło
4
Tak, wiem, że mogę skorzystać z tej metody, ale jestem ciekawy, dlaczego nie ma już bardziej eleganckiego rozwiązania.
Siergiej Baszarow
Czy naprawdę nie ma komendy npm do usuwania modułów węzłów innych niż usuwanie folderu?
Anders
4
Na platformie Windows kończy się niepowodzeniem podczas usuwania modułów_węzła przez Eksploratora lub wiersz poleceń (ponieważ ścieżka do niektórych modułów jest dłuższa niż 256). Powinno być polecenie npm, aby zrobić to w czystszy sposób.
Ravi Kumar,
9
Lub używając rmdir node_modules /s /qw systemie Windows. superuser.com/a/179661/440976
Wédney Yuri 30.01.2016
5
Myślę, że w tej odpowiedzi brakuje bardzo ważnego punktu: jeśli jesteś ograniczony ruchem (tj. Masz drogie połączenie płatne za megabajt, takie jak telefon komórkowy) i masz wiele modułów, może to cię kosztować , podczas gdy pruneopcja wymaga w ogóle posiadania połączenia z Internetem.
Ivan Kolmychek
102

Ze względu na zagnieżdżanie folderów system Windows nie może usunąć folderu, ponieważ jego nazwa jest za długa. Aby rozwiązać ten problem, zainstaluj RimRaf:

npm install rimraf -g

rimraf node_modules
użytkownik3844078
źródło
8
Lub po prosturm -rf node_modules
kappaallday
16
rm -rf node_modulesnie będzie działać w systemie Windows. Zobacz to rozwiązanie: superuser.com/a/179661/440976
Wédney Yuri 30.01.2016
1
rimraf win7 x64 działał świetnie dzięki PowerShell .. dzięki
gorelative 27.04.16
Najlepsze rozwiązanie dla Windows 10 64-bit za pośrednictwem CMD
Matt Cromwell
rm -rf node_modules nie działał dla mnie w systemie Windows 10. Ale rimraf pracował dla mnie
ssmsnet
24

po prostu biegnij

rm -r node_modules

w ten sposób możesz usunąć dowolny folder.

jak rm -r AnyFolderWhichIsNotDeletableFromShiftDeleteOrDelete .

po prostu otwórz gitbash przenieś do katalogu głównego folderu i uruchom to polecenie

Mam nadzieję, że to pomoże.

Ajay Kotnala
źródło
2
Nie działa, pojawia się błąd „odmowa zezwolenia” (przy użyciu gitbash.
drake035
3
otwórz gitbash w trybie administratora. myślę, że to pomoże. lub zmień ustawienia poziomu uprawnień do folderu
Ajay Kotnala 24.04.17
3
Spowodowałoby to usunięcie wszystkich pakietów. OP wyraźnie mówi: „Chcę wyczyścić folder node_modules, aby pozostały tylko moduły wymienione w pliku package.json”.
Boaz
w takim przypadku mój przyjacielu, możesz po prostu zrobić „npm odinstaluj nazwa_pakietu” lub - zapisz jako sufiks, który usunie również swój wpis z pliku package.json. npm odinstaluj nazwa_pakietu (usuń pakiet) npm odinstaluj nazwa_pakietu --save (usuń pakiet i usuń wpis z zależności w pakiecie json) npm odinstaluj nazwa_pakietu --save-dev (usuń pakiet i usuń wpis z niezgodności w pakiecie json)
Ajay Kotnala
22

Najpierw zainstaluj globalnie rimraf

npm install rimraf -g

przejdź do ścieżki za pomocą cmd, gdzie jest twój folder node_modules i zastosuj poniższe polecenie

rimraf node_modules
Ankit Parmar
źródło
dobra odpowiedź, ale instalowanie pakietu w celu odinstalowania innych nie jest dobrym pomysłem. npm prunejest idealnym rozwiązaniem.
Binayak Gouri Shankar
Tak, ale jeśli chcesz usunąć folder node_module ze swojego projektu, jest to najlepszy i łatwy sposób.
Ankit Parmar
9

od wersji 6.5.0 npm obsługuje polecenie clean-installtwardego odświeżania wszystkich pakietów

Giuseppe B.
źródło
1
Właśnie tego potrzebowałem. Kiedy aktualizuję węzeł, pierwszą rzeczą, która się dzieje, jest „wygląda na to, że zmieniłeś środowisko od uruchomienia„ instalacji npm ”. Ponieważ jestem już w konsoli, najłatwiej jest po prostu przeprowadzić czystą instalację, zamiast bawić się najpierw w usuwaniu folderów itp.
Jarrod McGuire
3

Dodałem kilka wierszy w pliku package.json:

"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",
  ...
}

Jeśli chcesz cleantylko możesz użyć tego rimraf node_moduleslub rm -rf node_modules.

To działa dobrze

Amitesh Singh
źródło
1

Najlepszy artykuł, jaki o nim znalazłem, to ten: https://trilon.io/blog/how-to-delete-all-nodemodules-recursively

Wszystko z konsoli i łatwe do uruchomienia z dowolnego punktu folderu.

Ale jako podsumowanie artykułu, to polecenie, aby znaleźć rozmiar każdego node_modulefolderu znalezionego w różnych projektach.

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

I aby je faktycznie usunąć:

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

Artykuł zawiera także instrukcje dotyczące powłoki systemu Windows.

robertovg
źródło
0

Usuń / Edytuj pakiety, które nie są potrzebne w package-lock.json (nazwy pakietów zostaną zapisane w zależności i devDependencies), a następnie

npm install

Fakrudeen
źródło
-2

Użyj następującego polecenia zamiast instalacji npm

npm ci
Jasmin Mistry
źródło
npm ci instaluje pakiety wymienione w
shrinkwrap.json