web-dev-qa-db-ja.com

package.jsonで未使用のnpmパッケージを見つける

Package.jsonファイルに不要になったパッケージがあるかどうかを判断する方法はありますか?

たとえば、パッケージを試して、後でコードをコメント化または削除し、アンインストールするのを忘れた場合、削除できるパッケージがいくつかあります。

パッケージを安全に削除できるかどうかを判断する効率的な方法は何でしょうか?

161
Josh C

depcheck というnpmモジュールを使用できます。

  1. モジュールをインストールします。

    npm install depcheck -g
    
  2. それを実行して、未使用の依存関係を見つけます。

    depcheck
    

このアプローチの良い点は、findまたはgrepコマンドを覚える必要がないことです。

インストールせずにを実行するにはnpxを使用します。

npx depcheck
171

npm-check というパッケージもあります:

npm-check

古く、誤った、未使用の依存関係を確認します。

enter image description here

非常に強力で、積極的に開発されています。未使用の依存関係をチェックする機能の1つです。この部分では、他の回答で言及した depcheck モジュールを使用します。

106
alecxe

OS(Linux、OSXなど)などのUnixを使用している場合は、findegrepの組み合わせを使用して、パッケージ名を含む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リポジトリに追加します...

4
fiskeben

fiskebenの書き込み:

欠点は、完全に自動化されていないことです。つまり、package.jsonからパッケージ名を抽出してチェックしません。パッケージごとにこれを行う必要があります。

何らかの理由でdepcheckが正しく機能しない場合は、Fiskebenの回答を自動化しましょう! (たとえば、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"

最初に、パッケージ名とファイルをキャッシュできる2つの一時ファイルを作成します。

findコマンドで始まります。 1行目と2行目は、node_modulesおよびbuildフォルダー(または必要なもの)を無視します。 3行目には許可されている拡張子が含まれています。ここにさらに追加できます。 JSXまたはJSONファイル。

関数は依存型を読み取ります。

最初にcats the package.json。次に、jqが必要な依存関係グループを取得します。 ({} +が存在するため、ファイルにピアの依存関係がない場合などにエラーをスローしません。)

その後、sedは、引用符で囲まれた部分、パッケージ名を抽出します。 -nおよび.../pは、jqのJSON出力から一致する部分のみを印刷するように指示します。次に、このパッケージ名のリストをwhileループに読み込みます。

RESは、引用符で囲まれたパッケージ名の出現回数です。今はimport/require ... 'package'/"package"です。ほとんどの場合、仕事をします。

次に、結果の行数をカウントして、結果を出力します。

警告:

  • さまざまなインポートでファイルが見つかりません。 tsconfig.jsonファイル(libオプション)
  • ^USEDおよびgrepファイルのみを手動でUNUSEDする必要があります。
  • 大規模なプロジェクトの場合は時間がかかります-シェルスクリプトは多くの場合、適切にスケーリングされません。しかし、うまくいけば、あなたはこれを何度も実行しないでしょう。
2
gombosg

この目的のために、以下のnpmモジュールを使用できます。

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

1
user11403389