Jos*_*h C 173 dependencies node.js npm
有没有办法确定你的package.json文件中是否有不再需要的软件包?
例如,在尝试打包并稍后评论或删除代码但忘记卸载时,我最终会得到一些可以删除的软件包.
什么是确定包是否可以安全删除的有效方法?
Ger*_*sio 184
您可以使用名为depcheck的npm模块.
安装模块:
npm install depcheck -g
or
yarn global add depcheck
Run Code Online (Sandbox Code Playgroud)运行它并找到未使用的依赖项:
depcheck
Run Code Online (Sandbox Code Playgroud)这种方法的好处是你不必记住find
或grep
命令.
Sat*_*hia 72
npm install depcheck -g
depcheck
Run Code Online (Sandbox Code Playgroud)
npm outdated
Run Code Online (Sandbox Code Playgroud)
tra*_*mer 16
这里的许多答案都是如何只找到未使用的物品。如果...我想自动 -- a)查找 + b)删除未使用的项目怎么办?
下面的选项 2 似乎是较新的方法。
选项1:
$ npm install -g typescript tslint tslint-etc
Run Code Online (Sandbox Code Playgroud)
{
"extends": [
"tslint-etc"
],
"rules": {
"no-unused-declaration": true
}
}
Run Code Online (Sandbox Code Playgroud)
$ 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)
Muj*_*lam 11
用于检查未使用的依赖项、库和未导入的文件
npx unimported
Run Code Online (Sandbox Code Playgroud)
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_modules
和build
文件夹(或任何你想要的)。第三行包含允许的扩展名,您可以在此处添加更多,例如 JSX 或 JSON 文件。
一个函数将读取依赖类型。
首先cat
是package.json
. 然后,jq
获取所需的依赖组。({} +
是否存在以便在文件中没有对等依赖项时不会抛出错误。)
之后,sed
提取引号之间的部分,包名称。-n
并.../p
告诉它打印匹配的部分,而不是从jq
的 JSON 输出中打印任何其他内容。然后我们将这个包名列表读入一个while
循环。
RES
是包名在引号中出现的次数。现在是import
/ require
... 'package'
/ "package"
。它在大多数情况下都能胜任。
然后我们简单地计算结果行的数量然后打印结果。
注意事项:
tsconfig.json
文件(lib
选项)grep
手动仅针对^USED
和UNUSED
文件。小智 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)
如果您使用的是类Unix操作系统(Linux操作系统,OSX等),那么你可以使用的组合find
和egrep
搜索需要您的包名的语句:
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存储库中...
归档时间: |
|
查看次数: |
61762 次 |
最近记录: |