【问题标题】:npm command to uninstall or prune unused packages in Node.jsnpm 命令卸载或修剪 Node.js 中未使用的包
【发布时间】:2014-02-20 10:12:59
【问题描述】:

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

【问题讨论】:

  • 未被什么使用?当文件夹从各自的package.json 中删除时,您的意思是从node_modules 中删除它们吗?
  • 没错,mhm npm ll 已经给出了很好的提示,哪些是候选人。

标签: node.js npm uninstallation


【解决方案1】:

注意:如果启用了包锁,则最近的npm 版本在运行npm install 时会自动执行此操作,因此除了删除带有--production 的开发包外,这不是必需的标志。


运行npm prune 以删除未在package.json 中列出的模块。

来自npm help prune

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

外部包是未列在父包的依赖项列表中的包。

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

【讨论】:

  • 如果我没看错的话,这将删除所有子依赖项,因为它们没有在package.json 中列出。那正确吗?因此,下一次更新或安装必须重新安装它们。
  • 让我举个例子。我从package.json 中删除业力,但离开凉亭。当我运行npm prune 时,我希望删除所有的业力,包括它自己的包含其依赖项的node_modules 文件夹。 bower 的依赖项(bower-json、bower-logger、chmodr、fstream、glob 等)呢?从技术上讲,这些没有在我的项目的package.json 中列出。那些被删除了吗?
  • 不,他们不是。请注意,它们不是在您自己的node_modules 中,而是在内部 node_modules/bower/node_modules,由node_modules/bower/package.json“保护”。你的包的依赖和你的包的依赖没有混合.
  • 在 npm install 之前删除你的收缩包装,应该在上面的说明中。
  • 我使用全局安装的depcheck 包来检查哪些包没有被使用。然后我去 package-json 并删除未使用的包。完成这两个步骤后,我运行npm prune,一切正常。
【解决方案2】:

如果您不担心几分钟的时间来这样做,一个解决方案是再次 rm -rf node_modulesnpm install 重建本地模块。

【讨论】:

  • 如果人们在没有评论的情况下停止投票,那就太好了。这是一种有效的策略来重置节点项目依赖项,以替代已接受的答案。如果您损坏了 node_modules 子目录的内容(很容易使用 sym 链接的依赖项),或者如果您进行了其他更改,例如 node 或 npm 版本碰撞 prune 将无法正确清理 node_modules 文件夹,但这个答案会。
  • 重建node_modules 也验证package.json 文件描述了一个可重现的依赖关系图。删除并重新安装您的 node_modules 基本上是一个部署测试。
  • npm prune 没有帮助一丁点,但这确实有效。我的问题是符号链接损坏。
  • 在许多目前使用 npm 不可行的非理想情况下。此外,这个问题肯定没有指定对重复工作或额外获取的一些限制,只是如何实现最终目标。这个答案满足了上述问题,尽管其他人可能想要超出该目标。
  • 一个方便的班轮是rm -rf node_modules && npm install 打卡走开回来。生活是美好的。
【解决方案3】:

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

npm prune [[<@scope>/]<pkg>...] [--production] [--dry-run] [--json]

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

外部包是未列在父包的依赖项列表中的包。

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

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

如果使用了 --json 标志,那么 npm prune 所做的更改(或使用 --dry-run 所做的更改)打印为 JSON 对象。

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

如果您禁用了包锁,则不会删除无关的模块,您可以不时运行 npm prune 来删除它们。

使用 npm-dedupe 减少重复

npm dedupe
npm ddp

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

例如,考虑这个依赖图:

a
+-- b <-- depends on c@1.0.x
|    `-- c@1.0.3
`-- d <-- depends on c@~1.0.9
     `-- c@1.0.10

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

 a
 +-- b
 +-- d
 `-- c@1.0.10

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

重复数据删除算法遍历树,将每个依赖项在树中尽可能向上移动,即使没有找到重复项。这将产生扁平和去重的树。

【讨论】:

  • 运行 npm dedupe 之后,我的 node_modules 文件夹中有更多项目。叹息!
  • 在使用 prune 时删除和卸载是否意味着同样的事情?我用--production 标志运行了一个修剪实例。但我的 package.json 文件从未更新。
  • prune 删除那些存在于 node_modules 文件夹中但未列为任何包的依赖项列表的文件。如果指定了 --production 标志或 NODE_ENV 环境变量设置为生产,则此命令将删除 devDependencies 中指定的包。
猜你喜欢
  • 2011-08-04
  • 1970-01-01
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-03
  • 2012-10-15
相关资源
最近更新 更多