Как очистить папку 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 попытается использовать кэшированную версию, избегая загрузки зависимости во второй раз.

adamduren
источник
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
user3844078
источник
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.

robertovg
источник
0

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

npm install

Fakrudeen
источник
-2

Используйте следующую команду вместо npm install

npm ci
Жасмин Мистри
источник
npm ci устанавливает пакеты, перечисленные в
shrinkwrap.json