我不是很懂 Node.js 社区的 DRY 文化

2018-04-19 01:12:14 +08:00
 FrankFang128

原文在知乎,欢迎交(tu)流(cao)

我终于知道为什么 npm install 总是动不动就下载 300 Mb 的东西了,Node.js 社区强调的 DRY 文化使得 node_modules 臃肿不堪,因为有的库引用了 is-object,有的库引用了 isobject,还有的库引用了 isObject,每个包看起来很 DRY,但是合起来就 wet 得不行了,呵呵。

我一直以为 npm 里下载量较大的 package 是 React 这样不错的包。

今天我才知道我错了。

目前 React 每周下载量是 240 万次。

然而下面我要说的几个包的下载量全都大于 React !


is-odd,每周下载 300 万次

源代码如下:

'use strict';

var isNumber = require('is-number');

module.exports = function isOdd(i) {
  if (!isNumber(i)) {
    throw new TypeError('is-odd expects a number.');
  }
  if (Number(i) !== Math.floor(i)) {
    throw new RangeError('is-odd expects an integer.');
  }
  return !!(~~i & 1);
};

你没有看错,五行核心代码,还依赖了一个 is-number 库。


这个 is-number 库更厉害,每周下载 1000 万次

源代码如下:

'use strict';

module.exports = function isNumber(num) {
  var number = +num;

  if ((number - number) !== 0) {
    // Discard Infinity and NaN
    return false;
  }

  if (number === num) {
    return true;
  }

  if (typeof num === 'string') {
    // String parsed, both a non-empty whitespace string and an empty string
    // will have been coerced to 0\. If 0 trim the string and see if its empty.
    if (number === 0 && num.trim() === '') {
      return false;
    }
    return true;
  }
  return false;
};

后来我发现这两个库的作者是同一个人(该作者水平很高),这个人还写了另外几个库:

需要指出的是

  1. webpack、babel 等库都有「间接地」依赖上面的一些包。
  2. 这些包的 markdown 代码远远多于 JS 代码,可能它们的 markdown 更值得我们学习

这件事对我的启发:

  1. 原来有这么多 JS 程序员不会判断奇数
  2. 只要 markdown 写得漂亮,就能迷倒 JS 程序员
  3. 1 + '1' 的问题一直在困扰 JS 程序员,我要不要写一个 add() 库解决这个问题呢

我终于知道为什么 npm install 总是动不动就下载 300 Mb 的东西了,Node.js 社区强调的 DRY 文化使得 node_modules 臃肿不堪,因为有的库引用了 is-object,有的库引用了 isobject,还有的库引用了 isObject,每个包看起来很 DRY,但是合起来就 wet 得不行了,呵呵。

Node 社区跟我想得不太一样,说不上好也说不上坏,反正不是很适合我。


以下是扯淡。

我是看到 Medium 上的一篇《混乱又危险的 Node.js 生态》才知道这些的,这篇文章里的一个评论我很赞同:

如果你不能在十秒钟内写出一个判断奇数的函数,要么你是一个糟糕的打字员,要么你就不应该当程序员!

还有一些颇为搞笑的评论:

18430 次点击
所在节点    Node.js
105 条回复
FrankFang128
2018-04-19 15:27:11 +08:00
@mooo 不带脑子算是我留的喷点啦,吐槽而已~
mooo
2018-04-19 15:34:08 +08:00
EyreFree
2018-04-19 15:37:10 +08:00
围观,[吃瓜]
LeungJZ
2018-04-19 17:12:35 +08:00
换个地方,再一次坐等打脸?
LeungJZ
2018-04-19 17:12:40 +08:00
lihongjie0209
2018-04-19 17:17:11 +08:00
@woodensail #15 你确定 maven 中会有这种垃圾库并且还有人用??
lwbjing
2018-04-19 17:27:42 +08:00
驳《我不是很懂 Node.js 社区的 DRY 文化》
https://mp.weixin.qq.com/s/OQsXOeah0ENK7Y6anAbXgg
@justjavac @FrankFang128

我只是转一下,大家别打我。。
yushiro
2018-04-19 17:27:46 +08:00
@FrankFang128 用不用这种总结前人经验的库,看你自己对自己的期望了。如果只是为了完成一份工作,那就自己写个简单的功能代码即可,万一出问题了,debug 解决呗。
如果是想成为一个优秀的开发者,这种库肯定要用啊,这是别人的经验,都已经帮你把坑都填了,非要自己再去踩坑?
woodensail
2018-04-19 17:29:27 +08:00
@lihongjie0209 我只是针对 300M 这一点而已。其他的我不予置评,但是 300M 的问题在任何包管理工具上都有。
lihongjie0209
2018-04-19 17:35:36 +08:00
@lwbjing #67 这篇文章强调了一个函数的正确性和性能,但是却没有说明一个好的模块不是由一个函数组成的, 而是由一系列高级抽象组成的, 到最后只会导致越来越多的臃肿代码
lihongjie0209
2018-04-19 17:48:51 +08:00
@Pastsong #55 最小化是有一个阈值的, 以函数为最小单位发包必定会导致依赖管理异常复杂.
LadyChunsKite
2018-04-19 17:51:53 +08:00
转发:驳《我不是很懂 Node.js 社区的 DRY 文化》
https://segmentfault.com/a/1190000014480379?utm_source=index-hottest
clino
2018-04-19 17:57:58 +08:00
@Wolfpancake #33 370 commits 103 contributors ... 大家好闲啊...
overflowHidden
2018-04-19 18:03:12 +08:00
@LadyChunsKite #72

“在回过头来看看 is-number 库,不仅仅有 100 多行的 test case,还有一个目录 benchmark。这里面的代码我没有数,但是光看文件数量就有 10 个以上。也就是说作者不仅仅保证了这个函数的运行结果没有问题,更保证了这个函数的性能。

我们为什么要使用这个库,因为作者为了他的 10 行代码,写了几百行的其它代码来保证质量。”

惊呆了。。。
clino
2018-04-19 18:18:48 +08:00
@LadyChunsKite #72
http://zhuanlan.zhihu.com/p/35870240 驳《驳《我不是很懂 Node.js 社区的 DRY 文化》》
https://zhuanlan.zhihu.com/p/35880323 请 Node.js 社区正面回答
quxiangxuanqxx
2018-04-19 18:35:42 +08:00
楼主说的挺好

就是那三句结论,全文最大的败笔呀,程序猿写结论的时候不应该开这种逻辑明显错误还迎战的玩笑

所以我的结论是

楼主文章没错,指出了 node 社区的问题,但是结论涉及引战

这对讨论问题没有任何帮助,你要是真想好好讨论问题,就别写这种槽点满满的结论

除非,你只是为了制造热度
easylee
2018-04-19 18:42:41 +08:00
这些算法都算不上的代码 实现都不会是怎么找到工作的?
mkeith
2018-04-19 18:49:27 +08:00
现在 nodejs 已经从服务端语言又变回浏览器端了
FrankFang128
2018-04-19 19:50:07 +08:00
@quxiangxuanqxx 250 多万 is-odd 的下载量得出这个结论我不觉得很过分,他们就是不会写判断奇数……
FrankFang128
2018-04-19 19:51:09 +08:00
@easylee 同疑惑

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

https://ex.noerr.eu.org/t/448002

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

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

© 2021 V2EX