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

时间:2014-03-27 00:10:46

标签: node.js dependencies npm

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

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

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

9 个答案:

答案 0 :(得分:146)

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

  1. 安装模块:

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

    depcheck
    
  3. 这种方法的好处在于您不必记住findgrep命令。

    要运行而不安装,请使用npx:

    npx depcheck
    

答案 1 :(得分:96)

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

  

NPM-检查

     

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

enter image description here

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

答案 2 :(得分:4)

如果您正在使用类似操作系统的Unix(Linux,OSX等),那么您可以使用findegrep的组合来搜索包含您的包名称的require语句:< / p>

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回购中......

答案 3 :(得分:3)

检查未使用的依赖项

npx depcheck

(或)

npm install depcheck -g
depcheck

enter image description here

检查过时的库

npm outdated

enter image description here

答案 4 :(得分:1)

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文件。

一个函数将读取依赖类型。

首先cat package.json。然后,jq获取所需的依赖项组。 ({} +在那里,所以如果文件中没有对等项依赖关系,它将不会引发错误。)

然后,sed提取引号之间的部分,即程序包名称。 -n.../p告诉它打印匹配的部分,而jq的JSON输出中没有其他内容。然后,我们将此包名称列表读入while循环中。

RES是用引号引起的包名称的出现次数。现在是import / require ... 'package' / "package"。在大多数情况下,它都能胜任。

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

注意事项:

  • 不会在其他导入中找到文件,例如tsconfig.json个文件(lib选项)
  • 您仅需要手动grep来处理^USEDUNUSED个文件。
  • 对于大型项目而言,速度很慢-Shell脚本通常无法很好地扩展。但希望您不会运行很多次。

答案 5 :(得分: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 .

答案 6 :(得分:1)

gombosg中的脚本比npm-check要好得多。
我做了一些修改,因此也会发现node_modules的依赖性。
示例sass从未使用,但在sass-loader

中需要
#!/bin/bash
DIRNAME=${1:-.}
cd $DIRNAME

FILES=$(mktemp)
PACKAGES=$(mktemp)

# use fd
# https://github.com/sharkdp/fd

function check {
    cat package.json \
        | jq "{} + .$1 | keys" \
        | sed -n 's/.*"\(.*\)".*/\1/p' > $PACKAGES
    echo "--------------------------"
    echo "Checking $1..."
    fd '(js|ts|json)$' -t f > $FILES
    while read PACKAGE
    do
        if [ -d "node_modules/${PACKAGE}" ]; then
            fd  -t f '(js|ts|json)$' node_modules/${PACKAGE} >> $FILES
        fi
        RES=$(cat $FILES | xargs -I {} egrep -i "(import|require|loader|plugins|${PACKAGE}).*['\"](${PACKAGE}|.?\d+)[\"']" '{}' | 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"

原始脚本的结果:

--------------------------
Checking dependencies...
UNUSED           jquery
--------------------------
Checking devDependencies...
UNUSED           @types/jquery
UNUSED           @types/jqueryui
USED (1)         autoprefixer
USED (1)         awesome-typescript-loader
USED (1)         cache-loader
USED (1)         css-loader
USED (1)         d3
USED (1)         mini-css-extract-plugin
USED (1)         postcss-loader
UNUSED           sass
USED (1)         sass-loader
USED (1)         terser-webpack-plugin
UNUSED           typescript
UNUSED           webpack
UNUSED           webpack-cli
USED (1)         webpack-fix-style-only-entries

和修改后的

Checking dependencies...
USED (5)         jquery
--------------------------
Checking devDependencies...
UNUSED           @types/jquery
UNUSED           @types/jqueryui
USED (1)         autoprefixer
USED (1)         awesome-typescript-loader
USED (1)         cache-loader
USED (1)         css-loader
USED (2)         d3
USED (1)         mini-css-extract-plugin
USED (1)         postcss-loader
USED (3)         sass
USED (1)         sass-loader
USED (1)         terser-webpack-plugin
USED (16)        typescript
USED (16)        webpack
USED (2)         webpack-cli
USED (2)         webpack-fix-style-only-entries

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

如果您想选择站在哪个巨人的肩膀上

这里是一个链接,用于生成npm可用选项的简短列表;它会过滤关键字unused packages

https://www.npmjs.com/search?q=unused%20packages