如何清理package.json中不包的package_modules文件夹?

Ser*_*rov 304 package node.js npm

假设我安装项目包npm install,查看package.json要安装的模块.过了一会儿,我发现我不需要一些特定的模块并从中删除它的依赖性package.json.然后我删除了一些其他模块,package.json因为它们不再需要,而其他模块则替换为替代模块.

现在我想清理node_modules文件夹,以便只有那些列出的模块package.json留在那里,其余的必须去,就像这样npm clean.我知道我可以手动删除它们但是希望有一些很好的准备使用糖功能.

Dav*_*ret 380

我想你在找 npm prune

npm prune [<name> [<name ...]]

此命令删除"无关"包.如果提供了包名称,则仅删除与提供的名称之一匹配的包.

无关的包是父包的依赖项列表中未列出的包.

请参阅文档:https://docs.npmjs.com/cli/prune

  • 据我所知,在新的 NPM 版本中,所有依赖项都位于根“node_modules”文件夹中,而不是像以前那样,每个依赖项都有自己的依赖项安装在自己的“node_modules”文件夹中..有无数的副本相同的依赖关系......那么“npm prune”是否考虑到了这一点?因为这些深度依赖项没有写在项目的主 `package.json` 上。 prune 必须递归地查找。 (2认同)
  • @vsync使用命令`npm dedupe` https://docs.npmjs.com/cli/dedupe实现复制减少.它试图通过在树上移动依赖项来简化节点树. (2认同)
  • 我已经看到 NPM prune 无法删除通常在我的公司存储库中有一些东西时会搞砸的东西。那我要rm-rf了。如果有一个“把所有东西都吹走,然后一次性重新获取所有东西”的命令就好了 (2认同)

ada*_*ren 178

您可以删除node_modules /文件夹,然后从package.json重新安装依赖项.

rm -rf node_modules/
npm install
Run Code Online (Sandbox Code Playgroud)

这将擦除当前文件夹中的所有已安装的包,并仅从package.json安装依赖项.如果先前已安装依赖项,则npm将尝试使用缓存版本,从而避免第二次下载依赖项.

  • 或者在Windows上使用`rmdir node_modules/s/q`.http://superuser.com/a/179661/440976 (8认同)
  • 是的,我知道我可以使用这种方法,但是我很好奇为什么仍然没有更好的解决方案。 (4认同)
  • 在Windows平台上,通过资源管理器或命令行删除node_modules时失败(因为某些模块的路径长于256).应该有npm命令以更干净的方式完成它. (4认同)
  • 我认为,这个答案缺少一个非常重要的观点:**如果你受到流量的限制(即你有像移动设备这样昂贵的每兆字节付费连接)并且你有很多模块,这可能会花费你**,而``prune`选项确实要求你有互联网连接. (3认同)

use*_*078 95

由于其文件夹嵌套,Windows无法删除该文件夹,因为其名称太长.要解决此问题,请安装RimRaf:

npm install rimraf -g

rimraf node_modules
Run Code Online (Sandbox Code Playgroud)

  • `rm -rf node_modules`不适用于Windows.请参阅此解决方案:http://superuser.com/a/179661/440976 (15认同)
  • 或者只是`rm -rf node_modules` (8认同)
  • rimraf为我工作(Windows 10) (2认同)

Aja*_*ala 24

简单的运行

rm -r node_modules
Run Code Online (Sandbox Code Playgroud)

事实上,您可以删除任何文件夹.

比如rm -r AnyFolderWhichIsNotDeletableFromShiftDeleteOrDelete.

只需打开gitbash移动到文件夹的根目录并运行此命令

希望这会有所帮助.

  • 在管理员模式下打开gitbash.我想这会有所帮助.或更改文件夹权限级别设置 (3认同)
  • 这将删除_ ** all ** _个软件包。OP明确表示“我想清理node \ _modules文件夹,以便仅package.json中列出的模块留在那里”。 (3认同)
  • 不起作用,我收到“权限被拒绝”错误(使用gitbash。 (2认同)

Ank*_*mar 21

首先全球安装rimraf

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

使用cmd在path_modules文件夹中转到路径,并在下面的命令中应用

rimraf node_modules
Run Code Online (Sandbox Code Playgroud)


rob*_*ovg 14

我发现的关于它的最好的文章是这篇:https://trilon.io/blog/how-to-delete-all-nodemodules-recursively

全部来自控制台,并且可以从任何文件夹点轻松执行。

但作为本文的总结,此命令用于查找node_module不同项目中找到的每个文件夹的大小。

find . -name "node_modules" -type d -prune -print | xargs du -chs
Run Code Online (Sandbox Code Playgroud)

并实际删除它们:

find . -name 'node_modules' -type d -prune -print -exec rm -rf '{}' \;
Run Code Online (Sandbox Code Playgroud)

本文还包含有关 Windows shell 的说明。


小智 9

你试过npm prune吗?

它应该卸载包文件中未列出的所有内容

https://npmjs.org/doc/cli/npm-prune.html


小智 7

我在 package.json 中添加了几行:

"scripts": {
  ...
  "clean": "rmdir /s /q node_modules",
  "reinstall": "npm run clean && npm install",
  "rebuild": "npm run clean && npm install && rmdir /s /q dist && npm run build --prod",
  ...
}
Run Code Online (Sandbox Code Playgroud)

如果您只想clean使用此rimraf node_modulesrm -rf node_modules.

效果很好


小智 7

以防万一有人需要它,这是我最近为解决这个问题所做的一些事情:

npm ci - 如果您想清理所有内容并从头开始安装所有软件包:

-它执行全新安装:如果 node_modules 文件夹存在,npm 将删除它并安装一个新的。

-检查一致性:如果 package-lock.json 不存在或者它与 package.json 的内容不匹配,npm 会因错误而停止。

https://docs.npmjs.com/cli/v6/commands/npm-ci

npm-dedupe - 如果要清理当前 node_modules 目录而不删除并重新安装所有软件包

搜索本地包树并尝试通过将依赖关系进一步向上移动树来简化整体结构,在那里它们可以被多个依赖包更有效地共享。

https://docs.npmjs.com/cli/v6/commands/npm-dedupe


小智 7

您还可以将npx与rimraf结合使用,通过一个命令删除所有节点模块,因此您不必先安装 rimraf。

因此,使用 cmd 转到 node_modules 文件夹所在的路径(如果您还不存在)并运行以下命令

npx rimraf node_modules
Run Code Online (Sandbox Code Playgroud)


小智 5

从6.5.0版本开始npm支持命令clean-install来强制刷新所有软件包

  • 这正是我所需要的。当我更新节点时,发生的第一件事是“看起来自从运行‘npm install’以来你已经改变了你的环境”。由于我已经在控制台中,因此最简单的方法是进行全新安装,而不是先删除文件夹等。 (2认同)

小智 5

我最近将 Angular 从 14 升级到 15,发现我需要这样做:

npm cache clean --force
npm cache verify
rm -rf node_modules/
npm install
Run Code Online (Sandbox Code Playgroud)

如果我不进行缓存清理,安装将在本地成功,但在服务器上运行部署时会失败。这是因为本地安装将使用本地缓存的包来安装。意识到。:)