Найти неиспользуемые пакеты npm в package.json


231

Есть ли способ определить, есть ли в вашем файле package.json пакеты, которые больше не нужны?

Например, при тестировании пакета и последующем комментировании или удалении кода, но забыв удалить его, я получаю пару пакетов, которые можно удалить.

Какой эффективный способ определить, можно ли безопасно удалить пакет?

Ответы:


259

Вы можете использовать модуль 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
Kiril

6
Не работал для меня В нем перечислены все пакеты как неиспользованные.
dev27

132

Существует также пакет под названием npm-check:

NPM-проверка

Проверьте устаревшие, неправильные и неиспользованные зависимости.

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

Это довольно мощный и активно развивающийся. Одна из его функций - проверка неиспользуемых зависимостей - для этой части используется depcheckмодуль, упомянутый в другом ответе.


8
Кажется, дает мне те же результаты, что и depcheck. Похоже, он даже использует depcheck для поиска неиспользуемых зависимостей.
Алекс К

3
npm outdatedпроверяет и перечисляет текущие, разыскиваемые и последние версии пакетов. Нет списка неиспользованных пакетов, хотя.
августа

1
тоже не выглядит полезным. Я использую стандартную угловую настройку, и здесь также перечислены все пакеты как неиспользованные, что также неправильно
Кайл Беркетт,

5

Если вы используете Unix-подобную ОС (Linux, OSX и т. Д.), Вы можете использовать комбинацию findи egrepдля поиска операторов require, содержащих имя вашего пакета:

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
Оззи

1
Видимо, используя этот подход, мы не используем модуль реагирования в нашем приложении React: D
OZZIE

4

фискебен написал (а):

Недостатком является то, что он не полностью автоматический, то есть он не извлекает имена пакетов из 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. Затем мы читаем этот список имен пакетов в whileцикл.

RESколичество вхождений имени пакета в кавычках. Прямо сейчас это import/ require... 'package'/ "package". Это делает работу в большинстве случаев.

Затем мы просто посчитаем количество строк результата и напечатаем результат.

Предостережения:

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

1
Редакторы иногда заставляют импорт переноситься в несколько строк. Будет ли этот скрипт перехватывать операторы, в которых «import» или «require» будут в строке, отличной от «from« PACKAGE_NAME »»? Другими словами, игнорирует ли он пробелы в импорте или требует операторов?
vdiaz1130

1

Для этой цели мы можем использовать приведенный ниже модуль npm:

https://www.npmjs.com/package/npm-check-unused


он обнаружил некоторые неиспользуемые, но также использованные, все еще полезные, я думаю :-) Он не понимает загрузчиков webpack ;-)
OZZIE

1

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

Я хотел удалить их автоматически .

  1. Установите этот проект узла.

    $ npm install -g typescript tslint tslint-etc


  1. В корневом каталоге добавьте новый файл tslint-imports.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
Алекс
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.