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прапор вказаний, ця команда видалить пакети, вказані у ваших devDependitions.


3
Якщо я прочитав це правильно, це видалить усі субзалежності, оскільки вони не вказані в package.json. Це так? Отже, наступне оновлення чи встановлення доведеться перевстановити.
nshew

1
Так, це усуне підзалежності. Підзалежності фактично зберігаються у власному node_modulesкаталозі модуля , тому вони видаляються разом з модулем.
Darkhogg

2
Дозвольте навести приклад. Я знімаю карму з себе package.json, але залишаю шару. Коли я біжу npm prune, я очікую, що вся карма, включаючи власну node_modulesпапку, що містить її залежності, буде видалена. Як щодо залежностей бауера (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 (це легко зробити із залежними від символів залежностями) або якщо у вас були додаткові зміни, такі як версія вузла чи npm bumps prune, не буде належним чином очистити папку node_modules, але ця відповідь буде.
Пірце

41
Перебудова node_modulesтакож підтверджує, що package.jsonфайл описує графік залежності відтворюваної залежності. Видалення та повторна інсталяція node_modules- це в основному тест на розгортання.
joemaller

2
@joemaller Не обов'язково, більшість робочих процесів розгортання мають, неявно або явно, певний кеш. Якщо пакет уже встановлений і відповідає специфікації, він зберігається. Якщо вилучити, то перевстановлення призведе до того, що пакет (и) буде оновлено останньою версією.
Darkhogg

7
npm pruneне допомогла жодна йота, але це зробило. Моєю проблемою було зламане симпосилання.
Ейрік Біркеланд

8
За багатьох неідеальних обставин, що зараз неможливо з npm. Також питання, безумовно, не вказувало обмежень на повторну роботу чи додатковий добір, як саме досягти кінцевої мети. Ця відповідь задовольняє поставлене запитання, незважаючи на те, що інші можуть хотіти за мету цієї мети.
Пірце

10

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

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

Ця команда видаляє "сторонні" пакети. Якщо вказано ім'я пакета, то видаляються лише пакети, що відповідають одному із поданих імен.

Сторонні пакети - це пакети, які не вказані у списку залежностей батьківського пакету.

Якщо --production прапор заданий або NODE_ENV змінна середовища для виробництва , ця команда видалить пакети , зазначені в ваших devDependencies . Налаштування - no-production не призведе до того, що NODE_ENV буде встановлено на виробництво .

Якщо використовується прапор --dry run , то фактично ніяких змін не буде зроблено.

Якщо використовується прапор --json , то зміни npm prune, зроблені (або зроблені з --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.