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-05 22:21:47 +08:00
@lewis89 #34 每次加依赖都应该把 effective pom 导出来看看, 这样可以避免很多问题
abcbuzhiming
2020-01-05 22:29:33 +08:00
说 npm 已经解决了的各位,我问一个问题,一个包,怎么才能在全局安装多个版本?到目前为止,我就没发现默认的 npm 有多版本共存的解决办法
lewis89
2020-01-05 22:34:05 +08:00
@lihongjie0209 #41 但是 Java 有些地方是动态加载 调用的 还是没法避免..
lihongjie0209
2020-01-05 22:38:34 +08:00
@lewis89 #43 这种问题应该会在开发和测试阶段就暴露出来, 同样的, 使用 BeanUtils 也只能在运行时报错, 只要使用了反射, 这种问题就无法避免
MiracleKagari
2020-01-05 22:40:52 +08:00
@uxstone 不是你用,是你引入的依赖用的依赖是不同的版本
YuTengjing
2020-01-05 22:45:00 +08:00
因为 node 是基于文件系统的模块化方案,设计上没有所谓的 classpath,必然是所有包都要安装到 node_modules 下。
jybox
2020-01-05 23:22:35 +08:00
@uxstone
@lihongjie0209
因为你控制不了你依赖的其他包作者用什么版本呀。举个例子 lodash 是 NPM 上被依赖最多的包,你项目依赖的很多其他包可能也依赖了 lodash,而他们依赖的版本可能和你不同。
Kilerd
2020-01-06 00:51:21 +08:00
有一说一,为什么还有人觉得 java 的包依赖管理好的呢
ashong
2020-01-06 02:01:48 +08:00
这正是 npm 的优点
zhw2590582
2020-01-06 08:39:09 +08:00
我当时也有这样的疑问
yinzhili
2020-01-06 08:52:37 +08:00
nodejs 这种新生事物各种包管理工具还有点混乱,和已经成熟的 java 生态系统没法比
lihongjie0209
2020-01-06 08:58:04 +08:00
@Kilerd #48 有什么缺点吗?
lihongjie0209
2020-01-06 09:18:59 +08:00
@yinzhili #51 我也是这么想的, 以后的项目我们是不是应该直接照抄业界也有的实现, 然后再根据自己的需求做定制化, 这样可以避免走一些别人已经踩过的坑.
yhxx
2020-01-06 09:31:14 +08:00
有的
PnP、pnpm、tink 都是这种思路
deleteDB
2020-01-06 09:36:00 +08:00
别问 问就是前端不行
一会是接口展示不行
一会是包管理不行

java 最棒 手动狗头保命
lihongjie0209
2020-01-06 09:46:56 +08:00
@yhxx #54 目前来看 pnp 和 tink 都在开发中, 还没有大规模使用, 而且 pnp 和 tink 都是与 hack nodejs 的 require, 如果与 wepack 使用, pnp 还需要使用自己的 loader, 总体来说改动还是比较大的
lihongjie0209
2020-01-06 09:47:56 +08:00
@deleteDB #55 你这种话没有任何意义, 行不行是一个很主观的东西, 但是有些东西缺点很明显, 还不能拿出来讨论了?
hitaoguo
2020-01-06 09:56:06 +08:00
1.路径会不会有问题?
你的电脑跟我的电脑全局安装的路径可能会不一样,项目里面如何引用。
hitaoguo
2020-01-06 09:57:24 +08:00
2.移除包的时候,会不会冗余?
比如这个包我只在一个项目里面用了,那我在项目里面 npm un 的时候会不会把全局的也删掉,那如果多个项目引用怎么判断。
yannxia
2020-01-06 09:57:57 +08:00
还是 Rust 的 Cargo 的包管理模式好啊,随便你怎么依赖不同的版本。Maven 的问题就是多版本依赖的问题,至于 NPM 的问题,包的质量的太低是真的。

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

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

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

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

© 2021 V2EX