在package.json中查找未使用的npm包

问题描述 投票:147回答:5

有没有办法确定你的package.json文件中是否有不再需要的软件包?

例如,在尝试打包并稍后评论或删除代码但忘记卸载时,我最终会得到一些可以删除的软件包。

什么是确定包是否可以安全删除的有效方法?

node.js dependencies npm
5个回答
156
投票

您可以使用名为depcheck的npm模块。

  1. 安装模块: npm install depcheck -g
  2. 运行它并找到未使用的依赖项: depcheck

这种方法的好处是你不必记住findgrep命令。

要在不安装的情况下运行使用npx:

npx depcheck

103
投票

还有一个名为npm-check的包:

ASL检查

检查过时,不正确和未使用的依赖项。

它非常强大并且积极发展。其中一个功能是检查未使用的依赖项 - 对于此部分,它使用另一个答案中提到的depcheck模块。


4
投票

如果您使用的是类似OS的操作系统(Linux,OSX等),那么您可以使用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回购中......


2
投票

fiskeben写道:

缺点是它不是完全自动的,即它不从package.json中提取包名并检查它们。您需要自己为每个包执行此操作。

如果由于某种原因depcheck无法正常工作,让Fiskeben的答案自动化! (例如,我尝试使用Typescript,它给出了不必要的解析错误)

为了解析package.json,我们可以使用软件jq。下面的shell脚本需要一个目录名称从哪里开始。

#!/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_modulesbuild文件夹(或任何你想要的)。第三行包含允许的扩展名,您可以在此添加更多内容,例如JSX或JSON文件。

函数将读取依赖类型。

首先它cats package.json。然后,jq获得所需的依赖组。 ({} +存在,因此如果文件中没有对等依赖项,它将不会抛出错误。)

之后,sed提取引号之间的部分,包名称。 -n.../p告诉它打印匹配的部分,而不是jq的JSON输出。然后我们将这个包名列表读入while循环。

RES是引号中包名称的出现次数。现在它是import / require ... 'package' / "package"。它适用于大多数情况。

然后我们只计算结果行数,然后打印结果。

注意事项:

  • 不会在不同的导入中找到文件,例如tsconfig.json文件(lib选项)
  • 你必须手动grep只有^USEDUNUSED文件。
  • 对于大型项目来说速度很慢 - shell脚本通常不能很好地扩展。但希望你不会这么多次。

0
投票

为此,我们可以使用下面的npm模块:

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

© www.soinside.com 2019 - 2024. All rights reserved.