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 为什么没有往这个方向发展
8788 次点击
所在节点    程序员
89 条回复
lihongjie0209
2020-01-06 12:04:56 +08:00
@fox1955 #80 你不加依赖了吗? 修改 webpack 配置加 loader 和插件也要 install 的
shyling
2020-01-06 12:34:03 +08:00
其实也很简单。。。npm 算是管理源码的,而 maven 这种是管理 jar 的。。。node 和 jvm 的区别,源码可以随便改,jar 没那么随便。js 复制到 node_modules 里就可以开始魔改了。。。(虽然发布时不建议)

java 系列用 build 工具解决这些问题,build 的时候去改包名解决版本冲突,文件冲突。。node 系列放在了编码时。

集中存放 jar 也会让空间一直膨胀,升级了依赖,删了一个项目之后 maven 可不知道旧的 jar 可以删掉了。。

不过其实也没什么好不好的吧。。。又没啥解决不了的问题。
shyling
2020-01-06 12:34:45 +08:00
@yannxia cargo 多版本的包 link 不也是会有问题
yannxia
2020-01-06 12:43:19 +08:00
@shyling 没有吧,A 依赖 X 的 0.1 版本和 B,B 依赖 X 的 0.2 版本。是没有干扰的,Maven 不爱处理这样的问题。至于代码要同时依赖 X 的 0.1 和 0.2,这解决不了,Java 靠 Classloader 能解决,Rust 倒是不知道怎么解决,不过这个场景用的倒是不多,上面那个很常见,所以现在 Maven 直接就搞 BOM。
shyling
2020-01-06 12:54:01 +08:00
@yannxia 对,其实就是把类似 java 的 shade 把相同的 rename 了,a 用的 0.1 的 b 里的 Type 和 c 用的 0.2 的 b 里的 Type 不是一个
azh7138m
2020-01-06 13:02:33 +08:00
如果是问支不支持,那是支持做链接的,全局保有一份,链接到项目里面。

因为历史原因,构建工具的 symlinks 处理是存在问题的,如果你不介意 break change,也不介意自己处理,直接用 PnP 就行了。
love
2020-01-06 13:17:39 +08:00
听起来你就是想节省硬盘?那你可以在工作区根目录安装所有你要用的包,工作区里所有的项目都可以直接用了
biossun
2020-01-06 17:20:32 +08:00
@zhbhun 其实是可以的,只要模块加载器根据 package.json 中的版本声明并结合 package-lock.json 中的版本信息,就可以处理 A 和 B 模块分别依赖 C 模块的不同版本的问题。
mgoann
2020-01-07 07:16:48 +08:00
我也挺讨厌 node 的包管理机制的,重使使用了淘宝镜像很多包下载不下来,随便一个空 react 成千上万个小文件在 node modules 下,移动删除都不方便
另外很多兄弟说为了加载不同版本的依赖包,实际情况这种需求我还真没遇到过

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

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

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

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

© 2021 V2EX