Как очистить папку node_modules от пакетов, которых нет в package.json?


339

Предположим, я устанавливаю пакеты проектов с npm installучетом package.jsonмодулей для установки. Через некоторое время я вижу, что мне не нужен какой-то конкретный модуль и удаляю его зависимость от package.json. Затем я удаляю некоторые другие модули, package.jsonпотому что они больше не нужны, а другие заменяются альтернативами.

Теперь я хочу очистить node_modulesпапку, чтобы там остались только модули, перечисленные в списке, package.jsonа остальные должны были что-то вроде npm clean. Я знаю, что могу удалить их вручную, но хотел бы иметь некоторые хорошие готовые к использованию функции сахара для этого.

Ответы:


408

Я думаю, что вы ищете npm prune

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

Эта команда удаляет «посторонние» пакеты. Если указано имя пакета, удаляются только пакеты, соответствующие одному из предоставленных имен.

Посторонние пакеты - это пакеты, которые не перечислены в списке зависимостей родительского пакета.

Смотрите документы: https://docs.npmjs.com/cli/prune


1
Насколько я знаю, в новой версии NPM все зависимости расположены в корневой node_modulesпапке, а не так, как раньше, где каждая зависимость имеет свои собственные зависимости, устанавливаемые в свои собственные node_modulesпапки ... с бесчисленными копиями одних и тех же зависимостей ... так npm pruneпринимает ли это во внимание? потому что эти глубокие зависимости не написаны на основной package.jsonчасти вашего проекта .. prune должен выглядеть рекурсивно.
— vsync

2
@vsync Сокращение дублирования достигается с помощью команды npm dedupe docs.npmjs.com/cli/dedupe . Он пытается упростить дерево узлов, перемещая зависимости вверх по дереву.
— knaos

Я видел, как NPM-чернослив не может удалить вещи, которые обычно портятся, когда в моем корпоративном репозитории что-то скрыто. Тогда я должен рм-рф. Было бы неплохо, если бы произошел удар «все, а потом забрать все все за один раз»
— ggb667

210

Вы можете удалить папку node_modules /, а затем переустановить зависимости из package.json.

rm -rf node_modules/
npm install

Это удалит все установленные пакеты в текущей папке и установит только зависимости из package.json. Если зависимости были установлены ранее, npm попытается использовать кэшированную версию, избегая загрузки зависимости во второй раз.


4
Да, я знаю, что могу использовать этот метод, но мне любопытно, почему до сих пор нет более элегантного решения для этого.
— Сергей Башаров

Неужели нет команды npm для удаления узловых модулей, кроме удаления папки?
— Андерс

4
На платформе Windows происходит сбой при удалении node_modules через проводник или командную строку (поскольку путь к некоторым модулям длиннее 256). Должна быть команда npm, чтобы сделать это более понятным способом.
— Рави Кумар

9
Или с помощью rmdir node_modules /s /qWindows. superuser.com/a/179661/440976
— Ведни Юрий

5
Я думаю, в этом ответе упущен очень важный момент: если вы ограничены трафиком (то есть у вас дорогое подключение за мегабайт, например, мобильное), и у вас много модулей, это может стоить вам , в то время как pruneопция действительно требует, чтобы у вас было подключение к интернету вообще.
— Иван Колмычек

103

Из-за вложенности папки Windows не может удалить папку, так как ее имя слишком длинное. Чтобы решить эту проблему, установите RimRaf:

npm install rimraf -g

rimraf node_modules

8
Или простоrm -rf node_modules
— kappaallday

16
rm -rf node_modulesне будет работать на окнах. Посмотрите это решение: superuser.com/a/179661/440976
— Ведни Юрий

1
win7 x64 rimraf отлично работал через PowerShell .. спасибо
— gorelative

Лучшее решение для 64-битной Windows 10 через CMD
— Мэтт Кромвелл,

rm -rf node_modules у меня не работали в Windows 10. Но у меня работал
— rimraf

24

просто беги

rm -r node_modules

на самом деле, вы можете удалить любую папку с этим.

как rm -r AnyFolderWhichIsNotDeletableFromShiftDeleteOrDelete .

просто открой гитбаш перейдите в корень папки и выполните эту команду

Надеюсь, это поможет.


2
Не работает, я получаю сообщение об ошибке «Отказано в доступе» (используя gitbash.
— drake035

3
откройте gitbash в режиме администратора. Я думаю, это поможет. или измените настройки уровня разрешений папки
— Ajay Kotnala

3
Это удалит все пакеты. ОП четко говорит: «Я хочу очистить папку node_modules, чтобы там оставались только модули, перечисленные в package.json».
— Вооз

в этом случае, мой друг, вы можете просто сделать «npm uninstall package_name» или --save в качестве суффикса, который также удалит его запись из файла package.json. npm удалить имя_пакета (удалить пакет) npm удалить имя_пакета --save (удалить пакет и удалить запись из зависимостей в пакете json) npm удалить имя_пакета --save-dev (удалить пакет и удалить запись из devdependencies в пакете json)
— Аджай Котнала

22

Первая глобальная установка rimraf

npm install rimraf -g

перейдите по пути, используя cmd, где ваша папка node_modules и примените приведенную ниже команду

rimraf node_modules

хороший ответ, но установка пакета для удаления других не очень хорошая идея. npm pruneэто идеальное решение.
— Бинайак Гури Шанкар

Да, но если вы хотите удалить папку node_module из вашего проекта, это самый лучший и простой способ.
— Анкит Пармар


9

с версии 6.5.0 npm поддерживает команду clean-installдля полного обновления всех пакетов


1
Это именно то, что мне было нужно. Когда я обновляю узел, первое, что происходит: «похоже, что вы изменили свою среду после запуска npm install». Поскольку я уже в консоли, проще всего выполнить чистую установку, а не возиться с удалением папок и т. Д.
— Джаррод МакГуайр,

3

Я добавил несколько строк в 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",
  ...
}

Если вы хотите cleanтолько вы можете использовать это rimraf node_modulesили rm -rf node_modules.

Работает нормально



1

Лучшая статья, которую я нашел об этом - это: https://trilon.io/blog/how-to-delete-all-nodemodules-recursively

Все из консоли и легко выполнить из любой точки папки.

Но, как краткое изложение статьи, эта команда позволяет найти размер каждой node_moduleпапки, найденной в разных проектах.

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

И фактически удалить их:

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

Статья содержит также инструкции для оболочки Windows.


0

Удалите / отредактируйте пакеты, которые не нужны в package-lock.json (имена пакетов будут записаны в зависимости и devDependencies), а затем

npm install


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.