为什么 node 项目的依赖都要放在 node_modules 下,而不整个中心依赖库?

2020-06-02 20:53:13 +08:00
 asanelder

比如有 2 两个 node 项目,依赖同一个库,那么每个项目中的 node_modules 都有一份。这不是重复下载和浪费磁盘空间么?

java 就不这样,java 一般都是放在 repository 下面(我指的是使用 maven).

当然,我知道可以 node install -g 。

但是我了解到的实践中,都是每个项目一份 node_modules 。

难到把所有项目的依赖放在一起会有问题?

7206 次点击
所在节点    Node.js
48 条回复
yujiff
2020-06-02 20:57:31 +08:00
好处,你可以想象得到吧?!
dalibaxiaoliba
2020-06-02 20:58:31 +08:00
难到把所有项目的依赖放在一起会没有问题吗?现在磁盘空间又不是问题
littleylv
2020-06-02 20:59:32 +08:00
版本问题。
来人,上吐槽 node_modules 文件夹的图
EPr2hh6LADQWqRVH
2020-06-02 20:59:56 +08:00
虽然同一个库但版本可能不同,你明白吧
FaiChou
2020-06-02 21:04:26 +08:00
@littleylv #3 <img src="" alt="node_module is like a black hole" />
pkuphy
2020-06-02 21:09:28 +08:00
@FaiChou 已正确脑补
forgottencoast
2020-06-02 21:10:26 +08:00
我记得 15 年的时候更恐怖,每一个库的依赖都放在自己库目录下的某个文件夹下(大概就是 node_modules ),
这样导致了路径很长的循环依赖。
我们在 Windows 上部署 CI 的时候,触发了路径超过 256 个字符的问题,当时我就震惊了,还能这样依赖的啊?
记得不是太清楚了,如有错误,欢迎指正。
abcbuzhiming
2020-06-02 21:14:23 +08:00
@dalibaxiaoliba 为啥总有人认为别人的电脑不是花钱买来的啊?你一个项目动则上 G 的依赖,还不是问题?
gitjavascript
2020-06-02 21:16:30 +08:00
磁盘算个啥,再说了一个机器难道还会部署很多项目么
abcbuzhiming
2020-06-02 21:19:50 +08:00
@avastms 之前也有人用这个做理由,说依赖同一个库但是版本不同。但是我后来想想发觉不对啊,你是可以依赖同一个库版本不同啊,你每个版本保存一份不就行了?好,问题来了,npm 有个天坑在于同一个包在本地无法多版本共存。于是它才不得不搞这种每个项目里都要塞一个依赖的做法
TransAM
2020-06-02 21:26:46 +08:00
。。。谁告诉你不可以的?

全局目录在 NODE_PATH 中配置,node 会在检查本地目录之后检查这个目录。
renmu123
2020-06-02 21:40:56 +08:00
我觉得这个挺好的,版本管理很方便,如果各种库能少一点就更好了
JJstyle
2020-06-02 21:45:20 +08:00
多版本我只见过 homebrew 支持,虽然它不是依赖管理
wangxiaoaer
2020-06-02 21:49:48 +08:00
@avastms maven 表示版本也成了问题?
asanelder
2020-06-02 21:53:43 +08:00
@dalibaxiaoliba #2
@avastms #4
@gitjavascript #9

java 就可以同一个库多版本并存啊,每个版本一个文件 夹不就行了

![CleanShot2020-06-02at21.52.45]( https://gitee.com/asanelder/pic_bed/raw/master/CleanShot%202020-06-02%20at%2021.52.45.png)
xiangwan
2020-06-02 21:57:27 +08:00
试试 lerna 或者 yarn workspace
axihe
2020-06-02 22:01:13 +08:00
楼主可以试一下 yarn2.0
包管理这方面,虽然 npm 一直在努力和进步,但 yarn 还是走在前沿的。
qingo
2020-06-02 22:08:37 +08:00
java 还需要一些 wrapper 在项目中,rust 的 carge 用的更整洁,一步一步改过来 go mod 我不错,没有为什么,就是傻 B 而已
asanelder
2020-06-02 22:10:06 +08:00
@qingo #18 哈哈,可以可以,等俺有精力,再了解了解其它的依赖管理
alan0liang
2020-06-02 22:16:50 +08:00
如 @axihe #17 所说,yarn 的 PnP 正解。
直接原因应该是实现简单(因为 npm 是完全独立于 Node 的,如果需要像 lz 附言里的图那样,要不改 Node (很不好改),要不自己运行时注入一个 resolver)
其实有一个很方便的地方,一个项目用完了可以放心的直接 rm -rf 掉,不用担心残留在本地的依赖项。(npm i -g 的包通常都是 cli,在项目里 require() 不到。)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/678007

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX