Nodejs 为什么不使用类似 Java 的 ClassPath + Maven 的包管理模式?

2020-01-05 15:24:45 +08:00
 lihongjie0209

这样做的好处很明显

  1. 包只需要全局存在, 不同版本的包在不同的文件夹, 全局只需要下载一次就好了
  2. 使用包只需要在启动时指定相关的 PATH 就可以了

这样可以完美的避免每个项目都需要 npm install 问题, 同一个包必须在每个项目中都拷贝一份

肯定有人说现在磁盘不值钱的, 所有依赖也就几百 MB, 不值得这种优化

但是有没有想过每次开发时每次 npm install 几分钟, 出错之后 windows 下删除又是几分钟(大量小文件)对开发效率的影响.

我的问题是:

  1. 这种模式有什么缺点吗?
  2. nodejs 为什么没有往这个方向发展
8416 次点击
所在节点    程序员
89 条回复
lihongjie0209
2020-01-05 18:02:40 +08:00
@optional #19 如果这是优点的话, 那么 pnpm 和 yarn 的 pnp 出现的意义是什么
zhbhun
2020-01-05 18:40:58 +08:00
同意 jybox 的看法,现在项目依赖多了出现版本冲突的情况很正常(假设模块 A 和 B 都依赖 C,但 C 的版本不同,A 要的是 Cv1,B 要的是 Cv2)。而基于 nodejs 依赖的查找原理(从当前目录开始往上级目录查找 node_modules 下的依赖),将依赖放在本地( B 和 C 各自在其目录下放一个对应版本的 C )可以很好的解决依赖版本冲突问题。
MoccaCafe
2020-01-05 18:46:03 +08:00
npm 最严重的问题就是安装依赖之后,有上万个细小文件,严重占据 inode 或者说复制困难。像 java 的 jar 包就非常合理了,java 虽然繁琐但是许多设计思想还是很好的
murmur
2020-01-05 18:46:30 +08:00
所以才有了 npm3,所以才有 yarn,npm 老版本的树状结构再 windows 下简直是噩梦,以前真的就是没法用
zhbhun
2020-01-05 18:47:03 +08:00
在 window 上的 nodejs 开发体验确实不好,我现在都是在 window 上用 vagrant 开个虚拟机,然后使用 vscode 的 ssh 远程开发,即使依赖再多 node_moduels 也是秒删的,node 运行时 cpu 占用率也低,风扇噪音也小了很多。
Juszoe
2020-01-05 19:00:26 +08:00
Node 之父也认为 node_modules 的设计是个错误
sessionreckon
2020-01-05 19:27:35 +08:00
@jybox Java 这种情况是可解的,就是比较麻烦,需要重新用 shade 打个包
Bromine0x23
2020-01-05 19:45:46 +08:00
个人认为 npm 的问题主要还是 node_modules
1) 依赖数量多(普遍上千),依赖安装后产生了大量文件夹和小文件,文件系统负担很大(当然这个可能算 js 依赖本身的性质导致的)
2) 默认将依赖解压到项目下的行为导致了重复存储,结合 1) 加剧了文件系统负担。

不同项目依赖不同版本的问题和使用全局存储是不冲突的,只要在路径上加上版本信息就行 比如 maven 用 package/version/ 或者 gems 用 package-version/
optional
2020-01-05 19:55:18 +08:00
@lihongjie0209 没有银弹解决所有人的需求和爱好
wangyzj
2020-01-05 20:20:45 +08:00
说实话
我更喜欢每个项目单独管理自己的依赖
干净
lihongjie0209
2020-01-05 20:23:09 +08:00
@wangyzj #30 难道 maven 做不到?
lewis89
2020-01-05 20:54:44 +08:00
@jybox #17 maven 是有一个默认优先的 ,最短引用路径的版本优先机制 ,
你没遇到过坑,我遇到过 那种动态反射拿出来了一个老版本的 class
但是用新版本的方法去调用 结果 出现 class 没有这种方法的报错,这种问题在 maven 打包的 java 里面经常遇到
lewis89
2020-01-05 20:58:03 +08:00
@lihongjie0209 #31

@jybox #17

https://segmentfault.com/a/1190000014938685

看看 maven 吧 一样有很多问题,版本依赖冲突这种问题 没什么好办法 ,只能通过人为管理的办法。
lewis89
2020-01-05 21:04:08 +08:00
@lihongjie0209 #31 我被 maven 坑了也不是一次两次了,最后还是想办法 excluse 掉一些引用 避免默认的最短路径优先的仲裁机制。
autoxbc
2020-01-05 21:08:55 +08:00
所以 Deno 里没有包管理,依赖什么就 import 网络地址,Deno 扫描一下全局缓存着
wangyzj
2020-01-05 21:21:23 +08:00
@lihongjie0209 没用过 maven
可你问的不是全局管理包吗
uxstone
2020-01-05 22:07:01 +08:00
@jybox 为什么要在项目里使用同一个包的不同版本,强行增加复杂度?
uxstone
2020-01-05 22:12:27 +08:00
https://v2ex.com/t/334487
三年前 我也提问过同样的问题, 慢慢习惯下来也就这样了
lihongjie0209
2020-01-05 22:16:04 +08:00
@uxstone #37 我看到这种说法的时候也是挺懵逼的, 这种情况应该尽量避免, 避免不了就特殊处理, 从来没把这种东西当作一个正常的需求
lihongjie0209
2020-01-05 22:19:42 +08:00
@wangyzj #36 我说的是全局存储, 动态加载, 没必要拷贝到当前项目下

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

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

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

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

© 2021 V2EX