ChatGPT解决这个技术问题 Extra ChatGPT

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

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

不被什么使用?当文件夹从相应的 package.json 中删除时,您的意思是从 node_modules 中删除它们吗?
确切地说,mhm npm ll 已经给出了一个很好的提示,哪些是候选人。

D
Darkhogg

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

运行 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 并且一切正常。
P
Pyrce

如果您不担心几分钟的时间来执行此操作,解决方案是再次使用 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 打卡走开回来。生活很好。
I
Igor Litvinovich

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

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

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

无关包是未列在父包的依赖项列表中的包。

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

如果使用 --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 标志的 prune 实例。但我的 package.json 文件从未更新。
prune 删除那些存在于 node_modules 文件夹中但未列为任何包的依赖项列表的文件。如果指定了 --production 标志或 NODE_ENV 环境变量设置为生产,此命令将删除 devDependencies 中指定的包。