npm命令用于卸载或修剪Node.js中未使用的包

Tar*_*ion 387 uninstall node.js npm

有没有办法简单地从Node.js项目中卸载所有未使用的(未声明的)依赖项(我不再定义的那些package.json).当我更新我的应用程序时,我喜欢自动删除未引用的包.

Dar*_*ogg 642

运行npm prune以取消未列出的模块package.json.

来自npm help prune:

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

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

如果--production指定了该标志,则此命令将删除devDependencies中指定的包.

  • 如果我正确读取,这将删除所有子依赖项,因为它们没有列在`package.json`中.是对的吗?因此,下一次更新或安装将不得不重新安装它们. (2认同)
  • 让我举个例子吧。我从我的 `package.json` 中删除了 karma,但离开了凉亭。当我运行 `npm prune` 时,我希望删除所有 karma,包括它自己的包含其依赖项的 `node_modules` 文件夹。bower 的依赖关系如何(bower-json、bower-logger、chmodr、fstream、glob 等)。从技术上讲,那些没有列在我的项目的 `package.json` 中。那些是删除还是不删除? (2认同)
  • 不,他们不是.请注意,它们不是*在你自己的`node_modules`中,而是*在*`node_modules/bower/node_modules`里面,由`node_modules/bower/package.json`"保护".包的依赖关系和包的依赖关系*不是混合*. (2认同)
  • **和**在npm安装之前删除你的shrinkwrap,应该已经在上面的说明中. (2认同)
  • 我使用全局安装的 `depcheck` 包来检查哪些包没有被使用。然后我转到 package-json 并删除未使用的包。在这两个步骤之后,我运行 `npm prune`,一切都结束了。 (2认同)

Pyr*_*rce 286

如果你不担心一两分钟的时间这样做,一个解决办法是rm -rf node_modulesnpm install再次来重建本地模块.

  • 如果人们在没有评论的情况下停止投票,这将是一件好事.重置节点项目依赖关系作为接受答案的替代方案是一种有效的策略.如果你损坏了node_modules子目录内容(容易与sym链接的依赖关系)或者如果你有其他更改,比如node或npm版本bumps,prune将无法正确清理node_modules文件夹,但是这个答案会. (87认同)
  • 重建`node_modules`还验证`package.json`文件描述了可重现的依赖图.删除和重新安装`node_modules`基本上是一个部署测试. (38认同)
  • 在许多非理想的情况下,目前npm是不可行的.此外,问题肯定没有指定对重复工作或额外提取的一些限制,只是如何实现最终目标.这个答案满足了所述的问题,尽管其他人可能想要超出该目标. (8认同)
  • `npm prune`没有帮助iota,但是这样做了.我的问题是一个破损的符号链接. (6认同)
  • @joemaller不一定,大多数部署工作流都有隐式或显式的某种缓存.如果已经安装了一个包并且符合规范,则会保留它.删除然后重新安装会将该软件包压缩到匹配的最新版本. (2认同)
  • 一个方便的衬垫是 `rm -rf node_modules && npm install` 打它走开回来。生活很好。 (2认同)
  • @Anoop.PA 投票(匿名)是有意且值得赞赏的事情。https://stackoverflow.com/help/why-vote 没有充分理由的投票是不受欢迎的。 (2认同)

Igo*_*ich 10

您可以使用npm-prune删除无关的包.

npm prune [[<@scope>/]<pkg>...] [--production] [--dry-run] [--json]
Run Code Online (Sandbox Code Playgroud)

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

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

如果指定了--production标志或将NODE_ENV环境变量设置为production,则此命令将删除devDependencies中指定的包.设置--no-production将否定NODE_ENV被设置为生产.

如果使用--dry-run标志,则实际上不会进行任何更改.

如果使用了--json标志,那么修改后的npm修剪(或者将使用--dry-run进行的修改)将作为JSON对象打印.

在启用了包锁的正常操作中,在安装模块时会自动修剪无关模块,并且您只需要使用带有--production标志的命令.

如果你已经禁用了包锁,那么无法删除无关的模块,你可以不时地运行npm prune来删除它们.

使用npm-dedupe减少重复

npm dedupe
npm ddp
Run Code Online (Sandbox Code Playgroud)

搜索本地包树并尝试通过将依赖关系进一步向上移动到树中来尝试简化整体结构,从而可以更有效地共享多个依赖包.

例如,考虑这个依赖图:

a
+-- b <-- depends on c@1.0.x
|    `-- c@1.0.3
`-- d <-- depends on c@~1.0.9
     `-- c@1.0.10
Run Code Online (Sandbox Code Playgroud)

在这种情况下,npm-dedupe会将树转换为:

 a
 +-- b
 +-- d
 `-- c@1.0.10
Run Code Online (Sandbox Code Playgroud)

由于节点模块查找的分层特性,b和d都将通过树的根级别的单个c包来满足它们的依赖性.

重复数据删除算法遍历树,尽可能地将每个依赖项移动到树中尽可能远,即使找不到重复项.这将导致平面和重复数据删除树.


小智 9

您可以运行npx depcheck以获取项目中未使用的依赖项和 devDependency 的列表。

然后你可以运行npm uninstall pkg1 pkg2等等来删除依赖关系。

或者,您也可以从package.json中删除依赖项,并在删除node_modulespackage-lock.json后重新安装包