是否有一种方法可以确定您的包中是否有包。Json文件,不再需要?

例如,当我尝试一个包,然后注释或删除代码,但忘记卸载它时,我最终得到了几个可以删除的包。

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


当前回答

除非我误解了gombog和nMo的脚本。这里有一个更快的nMo脚本扩展版本,默认为'find',但可以很容易地修改为使用'fd'查找功能。

不同之处在于,它首先查找所有相关文件,然后从所有相关文件中一次性找到grep包,而不是一个文件一个文件地查找。

可控制并发性,默认为8。

#!/bin/bash
DIRNAME=${1:-.}
cd "$DIRNAME"

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

export NUMCONCURRENT=8

function findCmd {
  startPath=${1:-.}
  find "$startPath" \
    -path ./node_modules -prune -or \
    -path ./build -prune -or \
    \( -name "*.ts" -or -name "*.js" -or -name "*.json" \) -print
}

# use fd
# https://github.com/sharkdp/fd
function findCmd_fd {
  startPath=${1:-.}
  fd  -t f '(js|ts|json)$' "$startPath"
}



function check {
    cat package.json \
        | jq "{} + .$1 | keys" \
        | sed -n 's/.*"\(.*\)".*/\1/p' > "$PACKAGES"
    echo "--------------------------"
    echo "Checking $1..."

    findCmd > "$FILES"
    while read PACKAGE
    do
        #echo "node_modules/${PACKAGE}"
        if [ -d "node_modules/${PACKAGE}" ]; then
                findCmd node_modules/${PACKAGE} >> $FILES
        fi
    done < $PACKAGES
    export FILES
    export SQ="'"
    xargs -P ${NUMCONCURRENT:-1} -r -a  "$PACKAGES" -I[] bash -c '
        PACKAGE="[]"

        RES=$(cat "$FILES" | xargs -r egrep -i "(import|require|loader|plugins|${PACKAGE}).*[\"${SQ}](${PACKAGE}|.?\d+)[\"${SQ}]" | wc -l)

        if [ $RES = 0 ]
        then
            echo -e "UNUSED\t\t $PACKAGE"
        else
            echo -e "USED ($RES)\t $PACKAGE"
        fi
    '
    [ -f  "$PACKAGES" ] && rm "$PACKAGES"
    [ -f  "$FILES" ] && rm "$FILES"
}

check "dependencies"
check "devDependencies"
check "peerDependencies"

其他回答

fiskeben wrote:

缺点是它不是全自动的,也就是说它不能从包中提取包名。Json并检查它们。您需要自己为每个包执行此操作。

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

用于解析包。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_modules和构建文件夹(或任何您想要的)。第三行包含允许的扩展名,你可以在这里添加更多,例如JSX或JSON文件。

函数将读取依赖类型。

首先,它包含了package.json。然后,jq获得所需的依赖项组。({} +是为了在文件中没有对等依赖时不会抛出错误。)

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

RES是包名在引号中出现的次数。现在是import/require…“包”/“包”。大多数情况下都是这样。

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

警告:

不会在不同的导入文件,如tsconfig。Json文件(lib选项) 你必须手动grep只有^USED和未使用的文件。 对于大型项目来说很慢——shell脚本通常不能很好地扩展。但希望你不会跑这么多次。

如果你使用的是类似Unix的操作系统(Linux, OSX等),那么你可以使用find和egrep的组合来搜索包含包名的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")' {} \;

or

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

缺点是它不是全自动的,也就是说它不能从包中提取包名。Json并检查它们。您需要自己为每个包执行此操作。因为包。json只是json,这可以通过编写一个使用child_process的小脚本来纠正。为每个依赖项运行此命令。让它成为一个模块。并将其添加到NPM回购…

你可以使用一个叫做depcheck的npm模块(至少需要Node的10版本)。

安装模块: NPM安装depcheck -g 或 纱线全局添加depcheck 运行它并找到未使用的依赖项: depcheck

这种方法的优点是您不必记住find或grep命令。

要运行而不安装使用npx:

npx depcheck 

除非我误解了gombog和nMo的脚本。这里有一个更快的nMo脚本扩展版本,默认为'find',但可以很容易地修改为使用'fd'查找功能。

不同之处在于,它首先查找所有相关文件,然后从所有相关文件中一次性找到grep包,而不是一个文件一个文件地查找。

可控制并发性,默认为8。

#!/bin/bash
DIRNAME=${1:-.}
cd "$DIRNAME"

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

export NUMCONCURRENT=8

function findCmd {
  startPath=${1:-.}
  find "$startPath" \
    -path ./node_modules -prune -or \
    -path ./build -prune -or \
    \( -name "*.ts" -or -name "*.js" -or -name "*.json" \) -print
}

# use fd
# https://github.com/sharkdp/fd
function findCmd_fd {
  startPath=${1:-.}
  fd  -t f '(js|ts|json)$' "$startPath"
}



function check {
    cat package.json \
        | jq "{} + .$1 | keys" \
        | sed -n 's/.*"\(.*\)".*/\1/p' > "$PACKAGES"
    echo "--------------------------"
    echo "Checking $1..."

    findCmd > "$FILES"
    while read PACKAGE
    do
        #echo "node_modules/${PACKAGE}"
        if [ -d "node_modules/${PACKAGE}" ]; then
                findCmd node_modules/${PACKAGE} >> $FILES
        fi
    done < $PACKAGES
    export FILES
    export SQ="'"
    xargs -P ${NUMCONCURRENT:-1} -r -a  "$PACKAGES" -I[] bash -c '
        PACKAGE="[]"

        RES=$(cat "$FILES" | xargs -r egrep -i "(import|require|loader|plugins|${PACKAGE}).*[\"${SQ}](${PACKAGE}|.?\d+)[\"${SQ}]" | wc -l)

        if [ $RES = 0 ]
        then
            echo -e "UNUSED\t\t $PACKAGE"
        else
            echo -e "USED ($RES)\t $PACKAGE"
        fi
    '
    [ -f  "$PACKAGES" ] && rm "$PACKAGES"
    [ -f  "$FILES" ] && rm "$FILES"
}

check "dependencies"
check "devDependencies"
check "peerDependencies"

检查未使用的依赖项

npm install depcheck -g
depcheck

查看过时的图书馆

npm outdated