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

Jos*_*h C 173 dependencies node.js npm

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

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

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

Ger*_*sio 184

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

  1. 安装模块:

    npm install depcheck -g
    
    or
    
    yarn global add depcheck
    
    Run Code Online (Sandbox Code Playgroud)
  2. 运行它并找到未使用的依赖项:

    depcheck
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 看起来不是很有用.我使用标准的angular2 cli设置和`depcheck`将每个包列为`unused`,这是错误的 (36认同)
  • 要运行一次(没有安装) - 使用[npx](https://www.npmjs.com/package/npx):`npx depcheck` (12认同)
  • depcheck-es6现在合并到depcheck中 (11认同)
  • NB.depcheck没有考虑package.json中指定的脚本中使用的包 (4认同)
  • 没为我工作。它列出了所有未使用的软件包。 (4认同)
  • 不起作用。我刚刚在我的 Gatsby 项目上运行了 `depcheck`,它把我几乎所有的包都列为 `unused`,即使它们中的大部分实际上都被使用过。 (3认同)
  • 它显示了一些未使用的依赖项,这些依赖项实际上正在使用,例如 babel-cli、css-loader、sass-loader 以及更多在构建过程中正在使用的依赖项。 (2认同)
  • 对于打字稿,请使用“npm install -g depcheck typescript”进行安装。然而,即使使用此选项,每个依赖项都被列为未使用。 (2认同)
  • 我有一个grunt构建,这建议删除devDependencies下的所有grunt软件包。这不是一个好主意:) (2认同)
  • 那么现在谁将删除这个“depcheck”? (2认同)
  • `depcheck` 严重加剧了我的依赖。我只是盲目地相信它并删除了它说未使用的软件包。我的项目仍然构建,但是在删除依赖项时出现了看不见的问题,并且在接下来的过程中,我遇到了很多问题。 (2认同)

ale*_*cxe 108

还有一个叫做的包npm-check:

NPM-检查

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

在此输入图像描述

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

  • 似乎给我与depcheck相同的结果.它看起来甚至使用depcheck来查找未使用的依赖项. (7认同)
  • ```npm outdated```检查并列出当前的、想要的和最新的软件包版本。虽然没有未使用的软件包列表。 (5认同)
  • 看起来也没什么用。我正在使用标准角度设置,这也将每个包列出为未使用,这同样是错误的 (5认同)

Sat*_*hia 72

检查未使用的依赖项

npm install depcheck -g
depcheck
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

检查过时的库

npm outdated
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • `depcheck` 似乎不适用于 Vue3 单文件组件。如果将依赖项标记为未使用,则表明应用程序中明确使用了该依赖项。你知道有任何这样的包可以与 vue 配合使用吗? (2认同)

tra*_*mer 16

这里的许多答案都是如何只找到未使用的物品。如果...我想自动 -- a)查找 + b)删除未使用的项目怎么办?

下面的选项 2 似乎是较新的方法。


选项1:

  1. 安装此节点项目。
 $ npm install -g typescript tslint tslint-etc
Run Code Online (Sandbox Code Playgroud)
  1. 在根目录中,添加一个新文件 tslint-imports.json
{
  "extends": [
    "tslint-etc"
  ],
  "rules": {
    "no-unused-declaration": true
  }
}
Run Code Online (Sandbox Code Playgroud)
  1. 运行此命令需要您自担风险,并进行备份:)
$ tslint --config tslint-imports.json --fix --project .
Run Code Online (Sandbox Code Playgroud)

选项 2(根据 @Alex 和 @JacopKane 的建议,谢谢):

// newer one line option
npx depcheck --json | jq '.dependencies[]' | xargs -L1 npm rm

// or
npm uninstall $(npx depcheck --oneline)
Run Code Online (Sandbox Code Playgroud)

  • `npx depcheck --json | 怎么样?jq '.依赖项[]' | xargs -L1 npm rm` (4认同)
  • tslint 自 2019 年起已弃用 (3认同)
  • 这个一行命令将通过 `depcheck` 模块删除所有未使用的包:`npm uninstall $(npx depcheck --oneline)` (2认同)

Muj*_*lam 11

用于检查未使用的依赖项、库和未导入的文件

 npx unimported 
Run Code Online (Sandbox Code Playgroud)

你会得到类似的结果在此输入图像描述

  • 无法找到此节点项目的入口点。请在 package.json 或 .unimportedrc.json 中声明它们 (2认同)

gom*_*osg 6

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"
Run Code Online (Sandbox Code Playgroud)

首先它创建两个临时文件,我们可以在其中缓存包名和文件。

它从find命令开始。第一行和第二行使它忽略node_modulesbuild文件夹(或任何你想要的)。第三行包含允许的扩展名,您可以在此处添加更多,例如 JSX 或 JSON 文件。

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

首先catpackage.json. 然后,jq获取所需的依赖组。({} +是否存在以便在文件中没有对等依赖项时不会抛出错误。)

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

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

然后我们简单地计算结果行的数量然后打印结果。

注意事项:

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


小智 6

gombosg的脚本比 npm-check 好得多。
我稍微修改了一下,所以也会发现node_modules中的devdependencies。从未使用过的
示例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"
Run Code Online (Sandbox Code Playgroud)

结果与原始脚本:

--------------------------
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
Run Code Online (Sandbox Code Playgroud)

和修改:

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
Run Code Online (Sandbox Code Playgroud)

  • 在 xargs 中添加 `-P 32` 开关将带来巨大的加速。 (4认同)

fis*_*ben 5

如果您使用的是类Unix操作系统(Linux操作系统,OSX等),那么你可以使用的组合findegrep搜索需要您的包名的语句:

find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni 'name-of-package' {} \;
Run Code Online (Sandbox Code Playgroud)

如果搜索整个require('name-of-package')语句,请记住使用正确的引号类型:

find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni 'require("name-of-package")' {} \;
Run Code Online (Sandbox Code Playgroud)

要么

find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni "require('name-of-package')" {} \;
Run Code Online (Sandbox Code Playgroud)

缺点是它不是全自动的,即它不会从中提取软件包名称package.json并进行检查。您需要自己为每个程序包执行此操作。由于package.json只是JSON,因此可以通过编写一个小的脚本child_process.exec针对每个依赖项运行此命令来解决。并使其成为一个模块。并将其添加到NPM存储库中...

  • “.jsx”文件和“.ts”文件等怎么样:D (2认同)
  • 显然,使用这种方法,我们没有在 React 应用程序中使用 React 模块:D (2认同)