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 条回复
hantsy
2020-01-05 15:32:33 +08:00
最新的 Yarn,NPM 好像都是全局的吧,只是项目下有一份 Copy。
lihongjie0209
2020-01-05 15:46:14 +08:00
@hantsy #1 应该说是全局缓存吧, 安装的时候还是会复制缓存到项目下
realkenshinji
2020-01-05 15:50:42 +08:00
缺点就是同一个包可能在不同项目下的版本不同,所以分项目来安装依赖是必须的,我想这也是 python 下项目为什么要搞 venv 的原因吧
charlie21
2020-01-05 15:59:42 +08:00
明知道有大量小文件的操作,为什么要在 win 下进行呢?
lihongjie0209
2020-01-05 16:04:14 +08:00
@charlie21 #4 我没必要因为一个包管理器换操作系统和硬件吧
lihongjie0209
2020-01-05 16:06:34 +08:00
@realkenshinji #3 在 Java 中, 比如说你要使用 packagex 1.1 版本的包, 那么就会在启动时指定 "maven 本地仓库 /packagex/1.1", 当你在另一个项目中使用 2.1 版本的时候, 就会指定 "maven 本地仓库 /packagex/2.1", 所以不会冲突
watzds
2020-01-05 16:25:04 +08:00
Java 要运行,也会打包复制那些吧
watzds
2020-01-05 16:25:20 +08:00
Java 要服务器上运行,也会打包复制那些吧
agagega
2020-01-05 16:27:25 +08:00
这不是 Node 一直吹的优点之一吗?像 RubyGems 这些工具就是像楼主说的一样按版本安装在系统目录的。
另外,install -g 不行?
lihongjie0209
2020-01-05 16:27:35 +08:00
@watzds #8 类似 webpack, 是可以配置的. 不过这里讨论的是在开发阶段, 如何避免这种不必要的依赖安装
lihongjie0209
2020-01-05 16:28:52 +08:00
@agagega #9 估计全局安装问题很大, 因为设计上之前就没考虑过这么使用
houzhenhong
2020-01-05 16:50:58 +08:00
pnpm 和 yarn 的 pnp 不知道符不符合你的要求
lihongjie0209
2020-01-05 16:52:17 +08:00
@houzhenhong #12 我去看看, 感谢回复
leafdream
2020-01-05 17:35:38 +08:00
你可以 npm i -g
gitjavascript
2020-01-05 17:42:29 +08:00
难道你们在服务器上 install 么
zappos
2020-01-05 17:46:27 +08:00
@realkenshinji venv 还不如 docker 方便。。。而且 venv 只解决 python 的问题,docker 可以解决任何语言的这类问题。
jybox
2020-01-05 17:46:27 +08:00
最大的好处就是每个包可以对自己使用的依赖版本有充分的控制。Node.js 里一个项目(由若干个包构成)里可以同时使用同一个包的不同版本,而不必像 Java (我不是很了解 Java,但我听说是这样)在一个项目中,只能使用一个包的特定版本,如果不同的包依赖了同一个包的不同版本,就可能出现无法解决的依赖冲突。

作为一个 Node.js 开发者,我是非常认可这种做法的,我认为这种设计所解决的问题是要比带来的麻烦多的。
zappos
2020-01-05 17:52:45 +08:00
( 1 )可以选择安装在局部和全局,( 2 )局部优先

npm 都实现了啊,没问题啊

只不过有时候 require 全局的包需要配置个路径,我记得,配置了就好了
optional
2020-01-05 18:00:03 +08:00
这是优点。。不是缺点。 全局安装还要管权限之类的问题
lihongjie0209
2020-01-05 18:02:04 +08:00
@optional #19 不需要, 类似 maven 全局安装可以指定任何目录, 每一个项目都可以配置自己的全局目录, 极端情况可以做到类似 npm 的一个项目一个本地仓库

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

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

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

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

© 2021 V2EX