我不是很懂 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 生态》才知道这些的,这篇文章里的一个评论我很赞同:

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

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

17216 次点击
所在节点    Node.js
105 条回复
POPOEVER
2018-04-19 12:27:23 +08:00
@Wolfpancake 被 license 笑死😂
yushiro
2018-04-19 12:33:02 +08:00
人家库的源代码都写的很明白了,你自己写一句简单的奇偶判断,有考虑到源码里面的那些情况吗?如果没有,那就好好的学习别人的思路吧。
Yuiham
2018-04-19 13:29:01 +08:00
很多 npm 包的粒度控制得不好,并不是说 leftpad 和 rightpad 分开就 dry 吧
lujiajing1126
2018-04-19 13:36:24 +08:00
没什么问题啊,如果别人的包更健壮,为什么不用?
楼主怕是从 ES6 才开始学 JS 的吧
FrankFang128
2018-04-19 13:41:36 +08:00
@lujiajing1126 你会用么
FrankFang128
2018-04-19 13:42:12 +08:00
@yushiro 你会考虑用这个库么?
FrankFang128
2018-04-19 13:42:21 +08:00
@lujiajing1126 你会考虑用这个库么?
jzz7280
2018-04-19 13:54:14 +08:00
确实乱
lol173
2018-04-19 14:21:39 +08:00
@Dawnki 可以判断奇偶数,虽然我还想不通为什么,我写 PHP 的
chairuosen
2018-04-19 14:28:56 +08:00
learnshare
2018-04-19 14:34:04 +08:00
当你需要一个功能的时候,必然有一个 npm 包在那里
mooo
2018-04-19 14:43:35 +08:00
@FrankFang128
> 1.原来有这么多 JS 程序员不会判断奇数
is-odd 每周下载 300 万是因为[nanomatch]( https://www.npmjs.com/package/nanomatch) 中引用了, 引用的原因看这个(pul requests)[https://github.com/micromatch/nanomatch/pull/7]
> 讽刺 JS 程序员写代码不带脑子哈哈..
明显是编程风格问题, 楼主提高到 JS 程序员的角度不知道楼主提问题带不带脑子
Dawnki
2018-04-19 14:45:55 +08:00
@lol173 你确定吗?它没有函数调用直接返回 false 哦 233333
myyou
2018-04-19 14:54:34 +08:00
这些东西应该整体做一个工具集,而不应该单独发布
Pastsong
2018-04-19 15:01:15 +08:00
工具集不符合社区推崇的是最小化 import,如果 is-odd 被项目里的 100 个包引用了,那最终产出的相关逻辑代码只有一份,但如果每个包自己实现了 is-odd,你在最后项目里就有 100 份相同代码
mooo
2018-04-19 15:17:07 +08:00
@myyou @Pastsong 工具集应该是 Lodash 这种吧, 楼主举得例子是因为 nanomatch 的作者认为
is-odd(x)这种比
x%2 ===0 这种更好所以创建了这个库
mooo
2018-04-19 15:20:51 +08:00
@murmur 其实是编程风格问题
FrankFang128
2018-04-19 15:24:36 +08:00
@kerr92 lodash 提供的其他 API 很好用的。
ke1vin
2018-04-19 15:25:25 +08:00
@Wolfpancake 为什么那么多 star ????
FrankFang128
2018-04-19 15:26:29 +08:00
@mooo 看了,原因是他是模块化的粉丝,也就是「他喜欢这么做」。

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

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

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

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

© 2021 V2EX