有没有办法确定你的package.json文件中是否有不再需要的软件包?
例如,在尝试打包并稍后评论或删除代码但忘记卸载时,我最终会得到一些可以删除的软件包。
什么是确定包是否可以安全删除的有效方法?
您可以使用名为depcheck的npm模块。
npm install depcheck -g
depcheck
这种方法的好处是你不必记住find
或grep
命令。
要在不安装的情况下运行使用npx:
npx depcheck
如果您使用的是类似OS的操作系统(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")' {} \;
要么
find . -path ./node_modules -prune -o -name "*.js" -exec egrep -ni "require('name-of-package')" {} \;
缺点是它不是完全自动的,即它不从package.json
中提取包名并检查它们。您需要自己为每个包执行此操作。由于package.json
只是JSON,因此可以通过编写一个使用child_process.exec
为每个依赖项运行此命令的小脚本来解决这个问题。并使其成为一个模块。并将其添加到NPM回购中......
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_modules
和build
文件夹(或任何你想要的)。第三行包含允许的扩展名,您可以在此添加更多内容,例如JSX或JSON文件。
函数将读取依赖类型。
首先它cat
s package.json
。然后,jq
获得所需的依赖组。 ({} +
存在,因此如果文件中没有对等依赖项,它将不会抛出错误。)
之后,sed
提取引号之间的部分,包名称。 -n
和.../p
告诉它打印匹配的部分,而不是jq
的JSON输出。然后我们将这个包名列表读入while
循环。
RES
是引号中包名称的出现次数。现在它是import
/ require
... 'package'
/ "package"
。它适用于大多数情况。
然后我们只计算结果行数,然后打印结果。
注意事项:
tsconfig.json
文件(lib
选项)grep
只有^USED
和UNUSED
文件。为此,我们可以使用下面的npm模块: