lisongeee
2022-08-03 20:22:58 +08:00
node_modules 是有黑洞缺点,但是却解决了《单个项目直接或间接依赖了同一个库的不同版本》的问题
就是项目存在这样的依赖结构,这基本上是每个项目必现的问题
A@1.0.0
--B@1.0.0
B@2.0.0
B@2.0.0 相对 B@1.0.0 发生完全破坏性更改,如何让 A@1.0.0 和 B@2.0.0 同时在这个项目正常工作?
除了 npm/pnpm/yarn 这类 node 包管理器,还有 deno ,我就没见过 《天然支持》多版本共存的依赖管理工具
另外 npm/yarn 以及 python 的 pip/pipenv/poetry 还有 java 的 maven/gradle 都存在 依赖提升 的问题,导致了你虽然只在项目声明了 A 包,但是你却可以直接使用 A 的依赖
比如 python 的 requests 依赖了 certifi ,你使用 pip 安装 requests 之后,你可以在你的项目里 import requests
也可以 import certifi ,但是这是不规范的,你只安装了 requests ,按理说应该只能 import requests ,不能使用 certifi
因为你没有 显式 声明或者安装
比如 java 的 com.blankj:utilcodex:1.31.0 这个包,它依赖了 com.google.code.gson:gson:2.8.5 ,当你在项目里声明这个包的依赖,虽然你的项目没有声明 com.google.code.gson:gson:2.8.5 但是你却可以直接使用 gson ,这就是依赖提升,
另外假设坏的情况下你的项目还有某个包依赖了 gson@1.0.0 ,它使用了 gson@1.0.0 的一个 A 类,但是这个 A 类在 gson@2 里面没有,你不是得手动解决? maven/gradle 能自动解决这个问题吗?
但是 node_modules + pnpm 下这些问题都不存在,开发者不需要手动改 sys 或者额外弄个 classloader
因此对我个人而言,我基本没有遇见 node 的依赖问题 ,而现在我用 pnpm ,通过文件链接的方式,磁盘占用问题和依赖提升问题也得到了良好的解决
倒是我以前写 Android 的时候,老是要针对某个包 exclude ,编译老是提示某个包缺失 类,但是 node 下我从来没有遇见这些问题
解决 node 的 node_modules 的黑洞问题,用 pnpm 或者 deno 就行