npm prune 与 npm dedupe

564 阅读7分钟

npm prune

作用

用于清理项目中不再需要的依赖包。它的主要作用是移除那些在 package.json 文件中没有列出,但在 node_modules 目录中存在的包。

  1. 清理不必要的依赖:在项目开发过程中,可能会安装一些临时的依赖包或者在 package.json 中移除某些依赖但忘记删除 node_modules 中的对应包。npm prune 会自动检测并移除这些不必要的依赖,从而保持 node_modules 目录的整洁。
  2. 减少磁盘占用:通过移除不必要的依赖包,npm prune 可以减少项目占用的磁盘空间,特别是在项目依赖较多且复杂的情况下。
  3. 避免潜在的冲突:不必要的依赖包可能会引入潜在的冲突或不兼容问题。通过定期运行 npm prune,可以避免这些问题,确保项目依赖的一致性和稳定性。
  4. 简化依赖树:清理不必要的依赖包可以使项目的依赖树更加简洁和清晰,便于管理和维护。

使用场景

  1. 项目开发过程中:定期运行 npm prune 以保持 node_modules 目录的整洁。
  2. 项目发布或部署前:运行 npm prune 以确保只包含必要的依赖包,减少不必要的资源占用。

你可以尝试运行

 npm ls

以下为运行结果

image.png

其中的 extraneous,就是不必要的依赖包。


这里引出一个问题:

如果包 a 没有在 package.json 文件中列出,包 b 有在 package.json 文件中,但是包 b 是依赖包 a 的,那 npm prune 清除依赖时,会把包 a 清除掉吗?

答案是:不会,npm prune 只会移除那些在 package.json 文件中没有列出且不是任何其他包依赖的包。

npm prune 的工作原理如下:

  1. 识别依赖关系npm prune 会首先解析 package.json 文件中的依赖列表,并构建一个依赖树。
  2. 检查 node_modules 目录:然后,它会检查 node_modules 目录中的所有包,判断哪些包在依赖树中没有对应的条目。
  3. 移除不必要的包:最后,它会移除那些在依赖树中没有对应条目的包,即那些在 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

在安装过程中,bc@1.0.3 依赖项被放置在树的根中。尽管 dc@1.x 的依赖可以由 c@1.0.3 满足,但还是使用了较新的 c@1.9.9 依赖项,因为 npm 默认支持更新,即使这样做会导致重复。

运行 npm dedupe 会让 npm 记录重复并重新评估,删除嵌套的 c@1.9.9 模块,因为根中的模块就足够了。

具体来说,npm dedupe 可以带来以下几个方面的优化:

  1. 减少重复依赖:在复杂的项目中,不同的包可能会依赖同一个包的不同版本。npm dedupe 会尝试将这些重复的依赖合并到更高层级,从而减少项目中重复的包,节省磁盘空间。
  2. 简化依赖树:通过减少重复的依赖,项目的依赖树会变得更加简洁和清晰,便于管理和维护。
  3. 提高安装速度:由于减少了重复的包,npm install 命令在安装依赖时会更快,因为需要下载和处理的包更少。
  4. 减少潜在的冲突:合并重复的依赖可以减少不同版本之间的潜在冲突,特别是在不同包依赖同一个包的不同版本时。
  5. 优化缓存利用:通过减少重复的包,npm 缓存可以更高效地利用,减少不必要的缓存占用。

使用场景

  1. 安装项目依赖时:使用 npm install --prefer-dedupe 或者 npm config set prefer-dedupe true,在安装过程中,要优先选择重复包数据删除而不是包的新颖性。
  2. 开发过程中定期运行 npm dedupe

你可以尝试运行

 npm ls --depth 1

以下为运行结果

image.png

其中的 deduped,就是重复的依赖包。

npm dedupe 的工作原理如下:

  1. 扫描依赖树

npm dedupe 首先会扫描项目的 node_modules 目录,构建一个依赖树。这个依赖树包含了项目中所有直接和间接依赖的包及其版本信息。

  1. 查找重复的包

在构建依赖树的过程中,npm dedupe 会查找那些在不同层级重复出现的包。这些重复的包可能是同一个包的不同版本,或者是同一个包的相同版本但出现在多个地方。

  1. 确定可合并的包

npm dedupe 会尝试将这些重复的包合并到依赖树的更高层级。合并的条件是:

  • 包的版本兼容:即合并后的版本需要满足所有依赖该包的包的版本要求。
  • 没有版本冲突:即不能有多个不兼容的版本要求。
  1. 执行合并操作

一旦确定了可以合并的包,npm dedupe 会执行合并操作,将这些包移动到依赖树的更高层级。这样,原本在不同层级重复出现的包就会被合并到一个地方,从而减少重复的包。

  1. 更新依赖树

合并操作完成后,npm dedupe 会更新项目的依赖树,确保所有依赖关系仍然满足。如果有任何依赖关系无法满足,npm dedupe 会回滚操作,保持原有的依赖树结构。

  1. 清理重复的包

最后,npm dedupe 会清理 node_modules 目录中那些在合并过程中重复不必要的包,从而进一步优化项目的依赖结构。



区别

npm prunenpm 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 目录的整洁。

两者都是用于优化项目依赖管理的工具,但侧重点和使用场景有所不同。在实际项目中,可以根据需要结合使用这两个命令,以达到更好的依赖管理效果。

更多使用方法详见官网:

npm prune

npm dedupe