Найти неиспользуемые пакеты npm в package.json
Есть ли способ определить, есть ли у вас пакеты в вашем файле package.json, которые больше не нужны?
Например, при опробовании пакета и последующем комментировании или удалении кода, но забыв удалить его, я получаю пару пакетов, которые можно удалить.
Что было бы эффективным способом определить, можно ли безопасно удалить пакет?
Ответы
Ответ 1
Вы можете использовать модуль npm под названием depcheck.
-
Установите модуль:
npm install depcheck -g
-
Запустите его и найдите неиспользуемые зависимости:
depcheck
Преимущество этого подхода в том, что вам не нужно запоминать команду find
или grep
.
Для запуска без установки используйте npx:
npx depcheck
Ответ 2
Существует также пакет под названием npm-check
:
NPM-проверка
Проверьте устаревшие, неправильные и неиспользуемые зависимости.
![enter image description here]()
Он достаточно мощный и активно развивается. Один из них включает проверку неиспользуемых зависимостей - для этой части он использует модуль depcheck
, упомянутый в другом ответе.
Ответ 3
Если вы используете 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, это можно было бы исправить, написав небольшой script, который использует child_process.exec
для запуска этой команды для каждой зависимости. И сделайте это модулем. И добавьте его в репозиторий NPM...
Ответ 4
Самый простой способ - использовать интерфейс npm:
$ npm prune
Я запускал это в проекте, над которым я работаю, и это было результатом:
root:~/project $ npm prune
unbuild [email protected]
unbuild [email protected]
unbuild [email protected]
unbuild [email protected]
unbuild [email protected]
unbuild [email protected]
unbuild [email protected]
unbuild [email protected]
unbuild [email protected]
Официальная документация - https://docs.npmjs.com/cli/prune
Ответ 5
фискебен написал (а):
Недостатком является то, что он не полностью автоматический, то есть он не извлекает имена пакетов из 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
. - Это медленно для больших проектов - сценарии оболочки часто плохо масштабируются. Но, надеюсь, вы не будете работать так много раз.
Ответ 6
Для этой цели мы можем использовать приведенный ниже модуль npm:
https://www.npmjs.com/package/npm-check-unused