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


231

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

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

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

回答:


258

depcheckと呼ばれるnpmモジュールを使用できます(少なくともノードのバージョン10が必要です)。

  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で指定されたスクリプトで使用されるパッケージを考慮に入れません
Javier Arias

17
(インストールO / W)一度だけそれを実行するには-利用NPXをnpx depcheck
キリル

6
私のために働いていませんでした。すべてのパッケージが未使用としてリストされていました。
dev27

131

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

npm-check

古く、正しくない、未使用の依存関係を確認します。

ここに画像の説明を入力してください

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


8
depcheckと同じ結果が得られるようです。未使用の依存関係を見つけるためにdepcheckを使用するようにも見えます。
Alex K

3
npm outdated現在、必要、最新のパッケージバージョンをチェックして一覧表示します。ただし、未使用のパッケージのリストはありません。
mgarde 2018年

1
同様に有用に見えません。私は標準の角度設定を使用しており、これもすべてのパッケージを未使用としてリストしますが、これは同じように間違っています
カイルバーケット

5

あなたはOSのような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

フィスケベンは書きました:

欠点は、完全に自動化されていないことです。つまり、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_modulesbuildフォルダー(または必要なもの)を無視します。3行目には許可された拡張子が含まれています。JSXまたはJSONファイルなど、ここにさらに追加できます。

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

最初catpackage.jsonです。次に、jq必要な依存関係グループを取得します。({} +たとえば、ファイルにピアの依存関係がない場合にエラーをスローしないようにするためです。)

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

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

次に、結果行の数を数え、結果を出力します。

警告:

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

1
エディターにより、インポートが複数行に折り返される場合があります。このスクリプトは、 'import'または 'require'が 'from“ PACKAGE_NAME”'とは異なる行にあるステートメントをキャッチしますか?つまり、インポートの空白を無視したり、ステートメントを要求したりしますか?
vdiaz1130


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ファイルからのみ削除されます。しかし、それでも良い。
Ahi Nahiyan

いかがですかnpx depcheck --json | jq '.dependencies[]' | xargs -L1 npm rm
アレックス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.