一个单行代码的 npm 库,竟然让数百万个 JavaScript 项目崩溃了

2020-04-27 21:42:50 +08:00
 matrix67
https://segmentfault.com/a/1190000022483038
5846 次点击
所在节点    程序员
41 条回复
xiangyuecn
2020-04-27 23:38:38 +08:00
@love #17 我觉得这个问题,不应该叫做问题。目测所有引用别的库的工具,都会产生此问题(他们怎么解决的我就不管了,也不懂):

1. A 引用了 Z 的大版本 1.x,B 引用了 Z 的大版本 1.X,你引用了 AB,似乎没有问题
2. A 引用了 Z 的大版本 1.X,B 引用了 Z 的小版本 1.1,你引用了 AB,当前 Z 版本 1.2,似乎是就有问题了,是让 A 乖乖就范呢还是怎么个倒退方法
3. A 引用了 Z 的大版本 1.x,B 引用了 Z 的大版本 2.X,你引用了 AB,矛盾凸显
DOLLOR
2020-04-27 23:43:55 +08:00
上次崩的好像是 isArray,同这次的 is-promise,都是数据类型判断相关的代码。
niubee1
2020-04-27 23:53:16 +08:00
一行代码的事情要搞成几行代码,真是走火入魔啊
love
2020-04-27 23:56:30 +08:00
@xiangyuecn npm 目前是会最大可能调合合并成引用同一份代码,实在不行才会分成二份(比如引用不兼容版本)。

至于别的语言没这问题那是因为它们的库都是大粒度的,这种几十几百行代码的各个库都自己写了一份,一个项目没多少第三方库数量,不象 npm 随便一个项目就有万千上万个,这样子开发当然是很爽了,基本你要的啥工具都有。
xiangyuecn
2020-04-28 00:17:29 +08:00
@love 嗯,原来是这样😃
Austaras
2020-04-28 05:26:25 +08:00
这个的核心问题在于 npm 默认是会改 lock 的

所以大家都来用 yarn 吧
zhw2590582
2020-04-28 08:34:44 +08:00
我想起有个 npm 包是用来判断一个数字是否偶数,几百万的下载量,然后就出现另一个包,直接引用前面那个包,判断非偶数(奇数),又几百万下载量。
firefox12
2020-04-28 08:43:13 +08:00
@baozijun 有什么区别吗? 那些被引用的代码 你也从来没读过 没 review 过。当 spring 升级后 这些引用升级了 你会去 review 吗? 所以和 npm 有什么区别?
ericgui
2020-04-28 08:45:07 +08:00
npm 里面太多 one-liner 了
msg7086
2020-04-28 08:58:18 +08:00
这不是 yarn 早就解决了么?为什么要用一个不能锁版本的软件包管理?
annielong
2020-04-28 09:18:50 +08:00
百行内的库绝不引用,太傻了
SilentDepth
2020-04-28 09:31:49 +08:00
@nyanyh #8 别人可能花了很大精力找出的最优实现、完善的单元测试和覆盖度测试,给你带来的不应当只是「省下两行代码」
Zoro76
2020-04-28 10:21:02 +08:00
@annielong 很多你引用的库都不超过百行,你不知道而已
shunia
2020-04-28 11:25:50 +08:00
yarn,pnpm 解君愁
npm 也一直在进步,但是似乎没有解决这个 nodejs 设计里留下来的问题。
yanguangs
2020-04-28 11:35:08 +08:00
@firefox12
java 的基本库很丰富,不会有这种 is-number is-promise is-xxx 的几十行的库.

但是 js 的 is-number 这种库偏偏就有些必要,
因为 js 的隐式转换以及 truthy falsy 想覆盖全真的很累.
yanguangs
2020-04-28 11:37:33 +08:00
@niubee1
类型判断在 js 里面真的不是一行代码能搞定的事情
js 以及 nodejs 的官方库也是真的拉胯,太少了.
iugo
2020-04-28 12:34:59 +08:00
我支持这种依赖的生态. 但值得优化的地方是, 更好的标准库.

比如 `String.prototype.padStart()` 这种改进.
firefox12
2020-04-28 13:07:33 +08:00
@yanguangs 你根本没搞清楚 核心是 review 而不是 1 行 2 行。 你一闭眼 进来了 100M Java 库,java 库开源的品质挺好,所以没问题, 而 js 呢? 你放进来的一下子就有问题了。 本质都一样, 你都是信任发布方,自己没有真正 review 过。

真的让我 review 这 100M java 库 我也没能力。java 库 要 review jvm 要不要 review. cpu 硬件呢? 社会效率变得无比底下。所以 这问题很难解。只不过 js 这种 实在就是太烂了。
charlie21
2020-04-28 18:25:44 +08:00
你们 JS 圈又出这事,上一次叫啥来着 left-pad ?
enrio
2020-04-28 20:32:54 +08:00
@zhw2590582 这很前端,把复用做到了极致🤡。

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

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

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

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

© 2021 V2EX