请教,为什么大部分框架,工具,脚手架等都需要在你的项目目录下重复的安装 node_modules?

2019-05-28 20:40:51 +08:00
 abcbuzhiming
NPM 明明是有所谓全局依赖存储路径的啊,为什么每个项目还需要单独一份 node_modules,非常的占空间。为啥不能像 maven,Gradle,Nuget 那样,只存一份完事了。是历史习惯,还是不得不这么做?
8700 次点击
所在节点    Node.js
53 条回复
mritd
2019-05-29 13:39:12 +08:00
@WittBulter #15 这不是我说不用就不用的问题,我记得很清楚,当时是一个 sass 的某个版本,智障的去下载 Github 的东西,然后 404 ;国内线上机房的网络大家都懂,本身链接 Github 就慢的要死,实际 Relese 版本还被作者删了;像 sass 这种东西生产级的项目你没法说不用就不用,就我目前做 Devops 来说,直接让前端换这种级别的东西有点过了

CI 现在都没法处理这个 node_modules,你说你 cache 整个目录,本身就贼鸡儿大就不说了,每个项目还一个; CI cache 时还会做压缩处理,里面全是海量小文件,有时候都可能出现文件名超出文件系统限制;你 cache npm、yarn 的哪个 cache 目录吧,有些包还特么自己联网下东西;就算不联网下载的你 cache 住了,你会发现 npm install 仍然会进行一个很长时间的编译动作,极大拖慢 CI build 时间
KuroNekoFan
2019-05-29 13:50:32 +08:00
@mritd node-sass,老大难了,但是算作 npm 的问题是不合适的
liuhuansir
2019-05-29 16:32:23 +08:00
每个项目都有个 node_modules,多了之后在 win10 上会出现我的电脑显示“处理中”,导致 explorer 卡住,只能重启解决,node_modules 里面小文件太多了
abcbuzhiming
2019-05-29 16:35:31 +08:00
@azh7138m 等一下朋友,我搜索资料过,说 NPM 现在已经能把依赖树扁平化了,只要依赖树扁平化,为何不能一个版本只存一份呢。你说的那些问题,如果 NPM 的扁平化依赖方式能处理,那么,只存一个位置——不管它放在哪里,都是毫无问题的。除非 NPM 的依赖扁平化也解决不了你说的:
P1 P2 依赖 D@1
P3 P4 依赖 D@2
你说的这个问题其实就是依赖不同版本,为了避免冲突,不得不用本地存放的方式来生成一个嵌套树

所以现在我感觉大家的回答很矛盾。我想问的是能不能“全部依赖放在集中的位置,一个版本只留一份”。而大家回答的是因为历史原因,容易出现依赖一个库但是版本不同的原因,为了应对这个问题,必须使用嵌套树存放,好像嵌套树才是 npm 必须使用本地目录存放依赖的根本原因。但是又有人回复我说 NPM 已经解决了这个依赖嵌套树,一级套一级问题,实现了依赖树扁平化——但是只要依赖树扁平化了,那实际就是一个版本只放一份吧。这等于说 NPM 依赖处理是可以实现集中存放的。还是说 NPM 的依赖扁平化并不是适用所有场景的?前套树在某些情况下还是得存在
lincanbin
2019-05-29 16:40:07 +08:00
空间换便利
liuhuansir
2019-05-29 16:46:00 +08:00
@abcbuzhiming 我查的资料是部分解决了嵌套问题,比如 A,B 同时依赖 C@1,那 C@1 不需要嵌套,如果 A 依赖 C@1,而 B 依赖 C@2,则还是以前的老办法
HiCode
2019-05-29 17:15:29 +08:00
接手过一个 node.js 写的 H5 小项目,整个项目代码大小 400MB ……

本来想凑合着用的,后来实在受不了,改用 PHP 重写,世界都清净了!!!

node 这样的玩法,我看不长久啊……(个人看法,不喜勿喷)
azh7138m
2019-05-29 17:20:34 +08:00
@abcbuzhiming > 只要依赖树扁平化,为何不能一个版本只存一份呢
是啊,这是两个场景
- 同一个项目
- 多个项目

对于第一种,各种管理器会尽可能的 resolve 一个依赖到同一个版本,如果可以,可能就会直接放置在项目的 node_modules 下面,哪怕它是依赖的依赖,不能的那些,还是会和原先一样,黑洞式放置

这里说到了 "尽可能的 resolve 一个依赖到同一个版本",如果本身就是写死了不同的版本,那么包管理器也是无能为力的。

对于第二种,历史包袱也在,版本冲突问题无法妥善解决。


上面说的问题都是,需要考虑兼容性的,如果是自己的项目,没有兼容性考虑,是完全可以实现 所有项目公用依赖 的。



扁平化,不是说完全扁平化,上面说了,是"尽可能的 resolve 一个依赖到同一个版本",本身声明依赖的版本就不同,(包管理器)是没有办法处理这种情况的。


最后,希望大家可以看下 PnP,以及社区围绕新的依赖布局的讨论,这些问题都是被讨论很多次了。
HiCode
2019-05-29 17:24:08 +08:00
建议 node 学 php 一样,大量常用函数直接内置,或者推动一两个标准“库”成为官方标准,我记得是有这样的库的。

现在大量 node 的项目引用成千上万个库,这些库又引用其他库,真当每个开发者的电脑都是顶配?真当开发者的时间、网络、硬盘不用钱?

有段时间确实想试试直接用 node 解决后端的,试了一下果断放弃,node 这玩意还是留给前端精英们去玩。反正学多一门语言( php、python、lua ……)又不难。
MissThee
2019-05-29 17:29:23 +08:00
@karnaugh 虽说是存一份儿,1.x 和 2.x 不能分开两个文件夹存嘛,各项目用配置的版本号各取所需
sodatea
2019-05-29 21:43:14 +08:00
Yarn Plug'n'Play 和 pnpm 可以了解一下,他们都是在试图解决这个问题
ericgui
2019-05-30 03:11:30 +08:00
老铁,你是没用过 python 吧? python 就是全局安装,后来用了个 virtualenv 来解决全局安装的问题

每个项目单独安装一下,你觉得不方便是因为你的网速太烂,这个没办法

但单独安装,显然是有极大的好处的
BlackHole1
2019-06-04 22:32:09 +08:00
node_modules 就是智障- -

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

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

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

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

© 2021 V2EX