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

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

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

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

Ответ 1

Вы можете использовать модуль npm под названием depcheck.

  1. Установите модуль:

    npm install depcheck -g
    
  2. Запустите его и найдите неиспользуемые зависимости:

    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.
  • Это медленно для больших проектов - сценарии оболочки часто плохо масштабируются. Но, надеюсь, вы не будете работать так много раз.