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

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

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

17106 次点击
所在节点    Node.js
105 条回复
Dawnki
2018-04-19 01:33:17 +08:00
看到那个既不是奇数也不是偶数的那个库 我躲在被窝里笑出了猪声 hhhhhhhhhh
FrankFang128
2018-04-19 01:40:41 +08:00
@Dawnki 讽刺 JS 程序员写代码不带脑子哈哈,说实话我从写代码第一天就是用 n % 2 === 1 来判断奇数,到底是什么人才会想要去引用一个库……是因为不会 % 运算符吗……
GooMS
2018-04-19 01:42:11 +08:00
有找包的时间早写了,我这俩月上业务一些 nodejs 就连续碰到三次因为基础库的基础库的基础库更新不兼容故障,就是几行代码,结果自下而上崩塌了。我现在很喜欢用 docker 包装 go
GooMS
2018-04-19 01:45:24 +08:00
一个 4000 + star 依赖了一个 20 + star 的库,那个库粗制滥造也没有测试说改就改 也不发大版本
FrankFang128
2018-04-19 01:45:53 +08:00
@GooMS nodejs 找包确实很费时间,经常遇到名字类似功能类似的,大部分时候完全在浪费时间。
FrankFang128
2018-04-19 01:46:29 +08:00
@GooMS 听起来很符合 Node.js 社区的风格
billlee
2018-04-19 01:49:24 +08:00
is-primitive, 点进去之前我还以为是判断素数的
FrankFang128
2018-04-19 01:59:30 +08:00
@billlee 我觉得 JS 程序员平时用不到这么复杂的算法(误
Luckyray
2018-04-19 02:01:55 +08:00
哈哈哈哈哈说的好有道理
hxd
2018-04-19 02:22:31 +08:00
人家活在无墙的世界,300M 不是问题
crysislinux
2018-04-19 06:50:44 +08:00
还真别笑,你写的和这些库跑的测试用例并不一样。所以说起来好像实现的是相同功能,但实际上并不一样
woodensail
2018-04-19 08:48:51 +08:00
DRY 又不是 node 特有的,事实上 DRY 理念的提出比 node.js 的历史还要长。
ghostheaven
2018-04-19 08:49:26 +08:00
好多都是 JS 语法本身的坑,比如判断是不是字符串,是不是函数这种最基本的,都没有简单的方法。再加上早期核心对象的方法缺失,虽然后来补上了,导致某些常用功能要做额外的判断方法是否存在,或者要做 polyfill,比如字符串的 trim 这种。还有现在 ES2015+更新的语法和标准函数对象的快速增加,不得不同时采用 polyfill 和 babel 这种语法转换工具,以兼容比较老的浏览器版本。
houbaron
2018-04-19 08:53:42 +08:00
我们弱类型语言就是这样的,只能靠隐式类型转换才能维持生活这样子的。
woodensail
2018-04-19 08:56:02 +08:00
顺便一提,你以为动不动就下载 300M 是 node 特有的问题?
事实上每个包管理工具都是这样的。pip,maven,npm 无一例外。这种现象的出现时由于依赖库太多或太重。另外,包括 npm 在内的所有包管理工具都是有本地仓库做缓存的。所以事实上日常使用中大部分情况都是走缓存,很少需要下载新包。

npm 真正存在的问题是所有依赖文件全部会复制一份到项目文件夹,项目启动时所有依赖资源打包在项目内。而不是其他工具一样,将包留在本地仓库中,解析依赖时从仓库进行加载。
murmur
2018-04-19 08:58:21 +08:00
这种库一般来说都是严格按照 ES6 或者 ES5 的规范实现的
为什么需要个库
因为 ES 规范就这么定义的 如果要把这些稍微超前一点的东西在 IE 上运行 你少写一行他不就不满足规范
des
2018-04-19 08:59:52 +08:00
@houbaron 呵,真香!
ywgx
2018-04-19 09:03:03 +08:00
就是因为这点,才彻底看衰 node.js
linxl
2018-04-19 09:10:05 +08:00
想到上次看到一个 json 解码的 node 包。。 很费解
kerr92
2018-04-19 09:11:00 +08:00
哈哈,不知道大家怎么看待用到 isArray, isUndefined 必须得引入 lodash 的前端程序员

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

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

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

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

© 2021 V2EX