Команда 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.

Darkhogg
источник
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снова перестроить локальные модули.

Pyrce
источник
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. Вздох!
Невилл