Знайдіть невикористані пакети npm у package.json


231

Чи є спосіб визначити, чи є у вашому файлі package.json пакунки, які більше не потрібні?

Наприклад, коли випробовуєте пакунок і пізніше коментуєте чи видаляєте код, але забуваючи видалити його, я закінчую парою пакетів, які можна було б видалити.

Який був би ефективний спосіб визначити, чи можна безпечно видалити пакет?

Відповіді:


258

Ви можете використовувати модуль npm, який називається depcheck (потрібна принаймні версія 10 Node).

  1. Встановіть модуль:

    npm install depcheck -g
    
    or
    
    yarn global add depcheck
  2. Запустіть його і знайдіть невикористані залежності:

    depcheck

Хороша річ у цьому підході, що вам не потрібно запам’ятовувати findабо grepкомандувати.

Для запуску без встановлення використовуйте npx:

npx depcheck

11
depcheck-es6 тепер об'єднаний у depcheck
cyberwombat

47
не виглядає корисним. Я використовую стандартні настройки для angular2 cli та depcheckперераховую кожен пакунок, як unusedце просто неправильно
phil294

5
NB. depcheck не враховує пакети, які використовуються в сценаріях, зазначених у package.json
Хав'єр Аріас

17
Щоб запустити його лише один раз (без встановлення) - використовуйте npx :npx depcheck
Кирило

6
Не працювало для мене. У ньому перераховані всі пакунки як невикористані.
дев27,

131

Існує також пакет під назвою npm-check:

npm-чек

Перевірте застарілі, неправильні та невикористані залежності.

введіть тут опис зображення

Він досить потужний і активно розвивається. Однією з його функцій є перевірка невикористаних залежностей - для цієї частини він використовує depcheckмодуль, згаданий в іншій відповіді.


8
Здається, дають мені ті ж результати, що і депеш. Схоже, він навіть використовує тестування для пошуку невикористаних залежностей.
Алекс К

3
npm outdatedперевіряє та перераховує поточні, потрібні та останні версії пакету. Немає списку невикористаних пакетів.
mgarde

1
також не виглядає корисною. Я використовую стандартну кутову установку, і тут також перераховано кожен пакет як невикористаний, що так само неправильно
Кайл

5

Якщо ви використовуєте Unix, як ОС (Linux, OSX тощо), ви можете використовувати комбінацію findта egrepшукати оператори, що вимагають, що містять назву вашого пакета:

find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni 'name-of-package' {} \;

Якщо ви шукаєте весь require('name-of-package')вислів, не забудьте використати правильний тип лапок:

find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni 'require("name-of-package")' {} \;

або

find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni "require('name-of-package')" {} \;

Мінус полягає в тому, що він не є повністю автоматичним, тобто він не вилучає імена пакетів package.jsonі не перевіряє їх. Вам потрібно зробити це для кожного пакета самостійно. Оскільки package.jsonтільки JSON, це можна усунути, написавши невеликий сценарій, який використовує child_process.execдля запуску цієї команди для кожної залежності. І зробіть це модулем. І додайте його до репортажу NPM ...


Що з .jsxфайлами та .tsфайлами тощо: D
OZZIE

1
Очевидно, використовуючи такий підхід, ми не використовуємо модуль реагування в нашому додатку React: D
OZZIE

4

fiskeben пише:

Мінус полягає в тому, що він не є повністю автоматичним, тобто він не вилучає імена пакунків з package.json і не перевіряє їх. Вам потрібно зробити це для кожного пакета самостійно.

Давайте зробимо відповідь Фіскебена автоматизованою, якщо з будь-якої причини depcheckне працює належним чином! (Наприклад, я спробував це з Typescript, і це дало непотрібні помилки розбору)

Для розбору package.jsonми можемо використовувати програмне забезпечення jq. Наведений нижче сценарій оболонки вимагає імені каталогу, з чого почати.

#!/bin/bash
DIRNAME=${1:-.}
cd $DIRNAME

FILES=$(mktemp)
PACKAGES=$(mktemp)

find . \
    -path ./node_modules -prune -or \
    -path ./build -prune -or \
    \( -name "*.ts" -or -name "*.js" -or -name "*.json" \) -print > $FILES

function check {
    cat package.json \
        | jq "{} + .$1 | keys" \
        | sed -n 's/.*"\(.*\)".*/\1/p' > $PACKAGES

    echo "--------------------------"
    echo "Checking $1..."
    while read PACKAGE
    do
        RES=$(cat $FILES | xargs -I {} egrep -i "(import|require).*['\"]$PACKAGE[\"']" '{}' | wc -l)
        if [ $RES = 0 ]
        then
            echo -e "UNUSED\t\t $PACKAGE"
        else
            echo -e "USED ($RES)\t $PACKAGE"
        fi
    done < $PACKAGES
}

check "dependencies"
check "devDependencies"
check "peerDependencies"

Спочатку він створює два тимчасові файли, де ми можемо кешувати назви пакетів та файли.

Починається з findкоманди. Перший і другий рядок змушують ігнорувати папки node_modulesта build(або все, що завгодно). Третій рядок містить дозволені розширення, сюди ви можете додати більше, наприклад файли JSX або JSON.

Функція буде читати залежні типи.

Спочатку це catвляет package.json. Потім jqотримує необхідну групу залежності. ( {} +чи існує так, що вона не видасть помилку, якщо, наприклад, у файлі немає рівних залежностей.)

Після цього sedвитягує частини між цитатами, назва пакета. -nі дозволяє .../pйому друкувати відповідні частини та нічого іншого з jqвиходу JSON 's. Потім ми читаємо цей список назв пакетів у whileциклі.

RES- кількість зустріч імені пакета в лапках. Зараз це import/ require... 'package'/ "package". Це робить роботу в більшості випадків.

Тоді ми просто підраховуємо кількість рядків результатів, після чого друкуємо результат.

Застереження:

  • Не знайдемо файлів у різному імпорті, наприклад tsconfig.jsonфайлів (lib опція)
  • Ви повинні grepвручну лише ^USEDта UNUSEDфайли.
  • Для великих проектів це повільно - сценарії оболонки часто не дуже масштабні. Але, сподіваємось, ви не будете працювати так багато разів.

1
Інколи редактори змушують імпорт перетворюватися на кілька рядків. Чи буде цей сценарій ловити висловлювання, де "імпорт" або "вимагати" буде в іншому рядку, ніж "з" PACKAGE_NAME ""? Іншими словами, чи ігнорує пробіл у імпорті чи вимагає заяви?
vdiaz1130


1

тут багато відповідей - як знайти невикористані предмети.

Я хотів їх автоматично видалити .

  1. Встановіть цей проект вузла.

    $ npm install -g typescript tslint tslint-etc


  1. У кореневому режимі додайте новий файл tslint-import.json

    { "extends": [ "tslint-etc" ], "rules": { "no-unused-declaration": true } }


  1. Виконайте це на свій страх і ризик, зробіть резервну копію :)

    $ tslint --config tslint-imports.json --fix --project .


Але це буде видалено лише з js-файлів. Але вам все одно добре.
Айон Нахіян

як щодоnpx depcheck --json | jq '.dependencies[]' | xargs -L1 npm rm
alex
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.