Команда npm для удаления или удаления неиспользуемых пакетов в Node.js


414

Есть ли способ просто удалить все неиспользуемые (необъявленные) зависимости из проекта Node.js. (те, которые больше не определены в моем package.json.) Когда я обновляю свое приложение, мне нравится автоматически удалять несвязанные пакеты.


1
Не используется чем? Вы хотите удалить папки, node_modulesкогда они удалены из соответствующих package.json?
— Слакс

1
точно, mhm npm ll уже дает хороший совет, какие кандидаты.
— Тарион

Ответы:


670

Примечание . Последние npmверсии делают это автоматически, когда включены блокировки пакетов, поэтому в этом нет необходимости, за исключением удаления пакетов разработки с --productionфлагом.


Запустите npm pruneдля удаления модулей, не перечисленных в package.json.

От npm help prune:

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

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

Если --productionуказан флаг, эта команда удалит пакеты, указанные в ваших devDependencies.


3
Если я прочитал это правильно, это удалило бы все подчиненные зависимости, так как они не перечислены в package.json. Это правильно? Итак, при следующем обновлении или установке их придется переустановить.
— nshew

1
Да, это удалит подчиненные. Суб-зависимости фактически хранятся в собственной node_modulesдиректории модуля , поэтому они удаляются вместе с модулем.
— Darkhogg

2
Позвольте мне привести пример. Я удаляю карму из своего package.json, но оставляю беседку. Когда я запускаю npm prune, я ожидаю, что вся карма, включая ее собственную node_modulesпапку с зависимостями, будет удалена. Как насчет зависимостей bower (bower-json, bower-logger, chmodr, fstream, glob и др.). Технически, они не перечислены в моем проекте package.json. Те удалены или нет?
— nshew

3
Нет, они не. Обратите внимание, что они не в вашем собственном node_modules, а внутри node_modules/bower/node_modules , «защищены» node_modules/bower/package.json. Зависимости вашего пакета и зависимости вашего пакета не смешаны .
— Darkhogg

2
и удалите свою термоусадочную пленку перед установкой npm, следуя инструкциям выше.
— Энди Рэй

306

Если вы не беспокоитесь о том, чтобы сделать это пару минут, можно будет снова rm -rf node_modulesи npm installснова перестроить локальные модули.


93
Было бы неплохо, если бы люди прекратили голосовать без комментариев. Это правильная стратегия сброса зависимостей проекта узла в качестве альтернативы принятому ответу. Если вы повредили содержимое подкаталога node_modules (это легко сделать с помощью зависимостей, связанных с sym) или если у вас были дополнительные изменения, такие как ноды или выпуски версий npm, prune не будет правильно очищать папку node_modules, но этот ответ будет.
— Пирс

41
Перестройка node_modulesтакже проверяет, что package.jsonфайл описывает воспроизводимый граф зависимостей. Удаление и переустановка - node_modulesэто в основном тест развертывания.
— Joemaller

2
@joemaller Не обязательно, большинство рабочих процессов развертывания имеют, явно или неявно, какой-то кеш. Если пакет уже установлен и соответствует спецификации, он сохраняется. Удаление и повторная установка приведут к тому, что этот пакет (ы) будет соответствовать последней версии.
— Дархогг

7
npm pruneне помог ни на йоту, но это помогло. Моя проблема была сломана символическая ссылка.
— Эйрик Биркеланд

8
При многих неидеальных обстоятельствах это невозможно с npm. Кроме того, вопрос определенно не определил какие-либо ограничения на повторную работу или дополнительные выборки, просто как достичь конечной цели. Этот ответ удовлетворяет поставленному вопросу, несмотря на то, что другие могут хотеть за пределами этой цели.
— Пирс

10

Вы можете использовать npm-prune для удаления посторонних пакетов.

npm prune [[<@scope>/]<pkg>...] [--production] [--dry-run] [--json]

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

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

Если указан флаг --production или для переменной среды NODE_ENV задано значение production , эта команда удалит пакеты, указанные в ваших devDependencies . Установка --no-production отменяет установку NODE_ENV на производство .

Если используется флаг --dry-run, то никаких изменений фактически не будет.

Если используется флаг --json, то изменения, внесенные в npm (или сделанные с помощью --dry-run ), будут напечатаны как объект JSON.

При нормальной работе с включенными блокировками пакетов посторонние модули автоматически удаляются при установке модулей, и вам понадобится только эта команда с флагом --production .

Если вы отключили блокировки пакетов, посторонние модули не будут удалены, и вы можете время от времени запускать npm prune для их удаления.

Используйте npm-dedupe, чтобы уменьшить дублирование

npm dedupe
npm ddp

Выполняет поиск в локальном дереве пакетов и пытается упростить общую структуру, перемещая зависимости дальше вверх по дереву, где они могут более эффективно использоваться несколькими зависимыми пакетами.

Например, рассмотрим этот график зависимости:

a
+-- b <-- depends on c@1.0.x
|    `-- c@1.0.3
`-- d <-- depends on c@~1.0.9
     `-- c@1.0.10

В этом случае npm-dedupe преобразует дерево в:

 a
 +-- b
 +-- d
 `-- c@1.0.10

Из-за иерархической природы поиска модулей узла, b и d будут получать свою зависимость, встречаемую одним пакетом c на корневом уровне дерева.

Алгоритм дедупликации обходит дерево, перемещая каждую зависимость как можно выше в дереве, даже если дубликаты не найдены. Это приведет как к плоскому, так и к дедуплицированному дереву.


У меня есть больше элементов в папке node_modules после запуска npm dedupe. Вздох!
— Невилл
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.