npm prune
作用
用于清理项目中不再需要的依赖包。它的主要作用是移除那些在 package.json 文件中没有列出,但在 node_modules 目录中存在的包。
- 清理不必要的依赖:在项目开发过程中,可能会安装一些临时的依赖包或者在
package.json中移除某些依赖但忘记删除node_modules中的对应包。npm prune会自动检测并移除这些不必要的依赖,从而保持node_modules目录的整洁。 - 减少磁盘占用:通过移除不必要的依赖包,
npm prune可以减少项目占用的磁盘空间,特别是在项目依赖较多且复杂的情况下。 - 避免潜在的冲突:不必要的依赖包可能会引入潜在的冲突或不兼容问题。通过定期运行
npm prune,可以避免这些问题,确保项目依赖的一致性和稳定性。 - 简化依赖树:清理不必要的依赖包可以使项目的依赖树更加简洁和清晰,便于管理和维护。
使用场景
- 项目开发过程中:定期运行
npm prune以保持node_modules目录的整洁。 - 项目发布或部署前:运行
npm prune以确保只包含必要的依赖包,减少不必要的资源占用。
你可以尝试运行
npm ls
以下为运行结果
其中的 extraneous,就是不必要的依赖包。
这里引出一个问题:
如果包
a没有在package.json文件中列出,包b有在package.json文件中,但是包b是依赖包a的,那npm prune清除依赖时,会把包a清除掉吗?
答案是:不会,npm prune 只会移除那些在 package.json 文件中没有列出且不是任何其他包依赖的包。
npm prune 的工作原理如下:
- 识别依赖关系:
npm prune会首先解析package.json文件中的依赖列表,并构建一个依赖树。 - 检查
node_modules目录:然后,它会检查node_modules目录中的所有包,判断哪些包在依赖树中没有对应的条目。 - 移除不必要的包:最后,它会移除那些在依赖树中没有对应条目的包,即那些在
package.json文件中没有列出且不是任何其他包依赖的包。
npm dedupe
作用
用于优化项目中的依赖树。它通过查找重复的依赖包并将其合并到依赖树的更高层级,从而减少重复的包,优化项目的结构。
举个例子,包 b 依赖包 c@1.0.x ,包 d 依赖包 c@1.x,在 node_modules 中实际依赖树如下:
a
+-- b <-- depends on c@1.0.x
+-- c@1.0.3
`-- d <-- depends on c@1.x
`-- c@1.9.9
在安装过程中,b 的 c@1.0.3 依赖项被放置在树的根中。尽管 d 对 c@1.x 的依赖可以由 c@1.0.3 满足,但还是使用了较新的 c@1.9.9 依赖项,因为 npm 默认支持更新,即使这样做会导致重复。
运行 npm dedupe 会让 npm 记录重复并重新评估,删除嵌套的 c@1.9.9 模块,因为根中的模块就足够了。
具体来说,npm dedupe 可以带来以下几个方面的优化:
- 减少重复依赖:在复杂的项目中,不同的包可能会依赖同一个包的不同版本。
npm dedupe会尝试将这些重复的依赖合并到更高层级,从而减少项目中重复的包,节省磁盘空间。 - 简化依赖树:通过减少重复的依赖,项目的依赖树会变得更加简洁和清晰,便于管理和维护。
- 提高安装速度:由于减少了重复的包,
npm install命令在安装依赖时会更快,因为需要下载和处理的包更少。 - 减少潜在的冲突:合并重复的依赖可以减少不同版本之间的潜在冲突,特别是在不同包依赖同一个包的不同版本时。
- 优化缓存利用:通过减少重复的包,npm 缓存可以更高效地利用,减少不必要的缓存占用。
使用场景
- 安装项目依赖时:使用
npm install --prefer-dedupe或者npm config set prefer-dedupe true,在安装过程中,要优先选择重复包数据删除而不是包的新颖性。 - 开发过程中定期运行
npm dedupe
你可以尝试运行
npm ls --depth 1
以下为运行结果
其中的 deduped,就是重复的依赖包。
npm dedupe 的工作原理如下:
- 扫描依赖树
npm dedupe 首先会扫描项目的 node_modules 目录,构建一个依赖树。这个依赖树包含了项目中所有直接和间接依赖的包及其版本信息。
- 查找重复的包
在构建依赖树的过程中,npm dedupe 会查找那些在不同层级重复出现的包。这些重复的包可能是同一个包的不同版本,或者是同一个包的相同版本但出现在多个地方。
- 确定可合并的包
npm dedupe 会尝试将这些重复的包合并到依赖树的更高层级。合并的条件是:
- 包的版本兼容:即合并后的版本需要满足所有依赖该包的包的版本要求。
- 没有版本冲突:即不能有多个不兼容的版本要求。
- 执行合并操作
一旦确定了可以合并的包,npm dedupe 会执行合并操作,将这些包移动到依赖树的更高层级。这样,原本在不同层级重复出现的包就会被合并到一个地方,从而减少重复的包。
- 更新依赖树
合并操作完成后,npm dedupe 会更新项目的依赖树,确保所有依赖关系仍然满足。如果有任何依赖关系无法满足,npm dedupe 会回滚操作,保持原有的依赖树结构。
- 清理重复的包
最后,npm dedupe 会清理 node_modules 目录中那些在合并过程中重复不必要的包,从而进一步优化项目的依赖结构。
区别
| npm prune | npm dedupe | |
|---|---|---|
| 作用 | 清理项目中不再需要的依赖包,即那些在 package.json 文件中没有列出但在 node_modules 目录中存在的包。 | 通过查找和合并项目中重复的依赖包,优化项目的依赖树结构 |
| 工作原理 | 它会根据 package.json 文件中的依赖列表,移除 node_modules 目录中那些不在列表中的包 | 它会扫描 node_modules 目录,查找重复的包,并将这些重复的包合并到依赖树的更高层级,从而减少重复的包,简化依赖树。 |
| 使用场景 | 1.在项目开发过程中,定期运行 npm prune 可以保持 node_modules 目录的整洁。2.在项目发布或部署前,运行 npm prune 可以确保只包含必要的依赖包,减少不必要的资源占用。 | 1.在项目依赖较多且复杂时,运行 npm dedupe 可以减少重复的包,优化依赖结构。2. 定期运行 npm dedupe 可以帮助保持项目的依赖树简洁和高效。 |
| 效果 | 1.移除不必要的依赖包,减少磁盘占用。2.保持 node_modules 目录的整洁,避免潜在的冲突。3.简化依赖树,便于管理和维护。 | 1.减少重复的依赖包,节省磁盘空间。2.简化依赖树,便于管理和维护。3.提高 npm install 的安装速度。 |
总结
npm dedupe主要用于优化依赖树结构,减少重复的依赖包。npm prune主要用于清理不必要的依赖包,保持node_modules目录的整洁。
两者都是用于优化项目依赖管理的工具,但侧重点和使用场景有所不同。在实际项目中,可以根据需要结合使用这两个命令,以达到更好的依赖管理效果。
更多使用方法详见官网: