是否有一种方法可以确定您的包中是否有包。Json文件,不再需要?
例如,当我尝试一个包,然后注释或删除代码,但忘记卸载它时,我最终得到了几个可以删除的包。
确定一个包是否可以安全删除的有效方法是什么?
是否有一种方法可以确定您的包中是否有包。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"
其他回答
gombog的脚本比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"
与原始脚本的结果:
--------------------------
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
如果你使用的是类似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回购…
如果你想选择站在哪个巨人的肩膀上
这里有一个链接来生成npm可用选项的简短列表;它过滤关键字未使用的包
https://www.npmjs.com/search?q=unused%20packages
为什么我的答案只是一个链接?
通常我不会只提供一个链接。这个问题的答案应该不那么费时。解决方案依赖于最新的软件。推荐一个可能已经停止维护的特定软件(这里的一些建议的情况)是没有什么用处的。帮助人们找到一些当前的东西似乎是合适的。
我已经创建了一个包unused-package (https://www.npmjs.com/package/unused-package),它返回任何未使用的包,或者如果包是devDependency,但作为正常依赖项安装
创建一个文件并将此代码添加到您的文件中
const check = require("unused-package");
check({ entries: ['entry path to your code'] }).then((res) => {
console.log(res) // list of packages returned by library
});
used-package相对于depcheck包的一个优点是unused-package支持多个入口路径。
在Yarn 2。X及以上,使用:
yarn dlx depcheck
Yarn DLX被设计用来执行一次性脚本,这些脚本可能已经在Yarn 1.x中作为全局包安装。管理系统级包超出了yarn的范围。为了反映这一点,yarn全局已被删除。
来源:https://yarnpkg.com/getting-started/migration use-yarn-dlx-instead-of-yarn-global