有没有办法简单地从 Node.js 项目中卸载所有未使用的(未声明的)依赖项(在我的 package.json
中不再定义的依赖项)。当我更新我的应用程序时,我希望自动删除未引用的包。
package.json
中删除时,您的意思是从 node_modules
中删除它们吗?
注意:如果启用了包锁,则最近的 npm
版本在运行 npm install
时会自动执行此操作,因此除了删除带有 --production
标志的开发包外,这不是必需的。< /em>
运行 npm prune
以删除 package.json
中未列出的模块。
从 npm help prune
:
此命令删除“无关”包。如果提供了包名称,则仅删除与提供的名称之一匹配的包。无关包是未列在父包的依赖项列表中的包。如果指定了 --production 标志,此命令将删除 devDependencies 中指定的包。
如果您不担心几分钟的时间来执行此操作,解决方案是再次使用 rm -rf node_modules
和 npm install
来重建本地模块。
node_modules
还验证 package.json
文件描述了可重现的依赖关系图。删除并重新安装您的 node_modules
基本上是一个部署测试。
npm prune
没有帮助一丁点,但确实有帮助。我的问题是符号链接损坏。
rm -rf node_modules && npm install
打卡走开回来。生活很好。
您可以使用 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 包来满足它们的依赖关系。
重复数据删除算法遍历树,将每个依赖项在树中尽可能向上移动,即使没有找到重复项。这将产生平坦和去重的树。
--production
标志的 prune 实例。但我的 package.json 文件从未更新。
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
“保护”。你的包的依赖和你的包的依赖没有混合。depcheck
包来检查哪些包没有被使用。然后我去 package-json 并删除未使用的包。在这两个步骤之后,我运行npm prune
并且一切正常。