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

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

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

17163 次点击
所在节点    Node.js
105 条回复
mooo
2018-04-19 09:18:45 +08:00
动不动下载 300M 和这个还真没关系。
viko16
2018-04-19 09:23:49 +08:00
面向 npm install 编程的我含泪点赞…
crist
2018-04-19 09:26:07 +08:00
最好语言 PHP 欢迎你!
misaka19000
2018-04-19 09:27:33 +08:00
zhouxuchen
2018-04-19 09:32:13 +08:00
每一次 npm install 都是奇妙的旅行……
webluoye
2018-04-19 09:33:49 +08:00
php 现在的包管理也是动不动依赖一堆
qiqico
2018-04-19 09:38:01 +08:00
基本同意楼主观点

不过也不是所有人都这样的,比如我就不喜欢用 lodash 这种库,现在用 babel 的情况下
janxin
2018-04-19 09:40:16 +08:00
一行代码都不写你都可以拉 300M 下来
LxRuzx
2018-04-19 09:40:17 +08:00
为啥这个页面是 黑的???
dany813
2018-04-19 10:10:37 +08:00
老哥 cnode 发一遍 这边发一遍 好闲啊
soulmine
2018-04-19 10:41:46 +08:00
你们 node 不都是写个 hello world 然后下了 1000+的包么
wbswjc
2018-04-19 11:21:27 +08:00
@LxRuzx 因为这个节点都是 node 黑
Wolfpancake
2018-04-19 11:36:10 +08:00
Mitt
2018-04-19 11:56:12 +08:00
这是一个问题 但这不是一个大问题 它既不影响你开发也不影响你运行和部署 它只是让你看起来很糟糕
zachguo
2018-04-19 12:07:47 +08:00
- 跟 DRY 没有关系
- JS 打包和发布太容易了
- ES5 之前的历史遗留问题
- 这个问题不难解决
StickmY
2018-04-19 12:07:51 +08:00
@FrankFang128 这样这有很明显的问题,因为 js 的弱类型特征,需要做很多判断
lxy
2018-04-19 12:17:28 +08:00
一次同事突发奇想要打包( rar )项目的 .node_models,电脑是固态硬盘,结果我们出去吃饭半小时回来了还没打包完..
xiaojie668329
2018-04-19 12:22:52 +08:00
神烦那些什么都要引入一个包的人,为了一个方法引入整个 lodash。还有一些很简单的库,明明写一个也不用多少时间。他引入了,为了确保准确,还得去找这个包来看 api 作用。🙄
leetom
2018-04-19 12:23:20 +08:00
记得看到过一个一行代码的包,下载量也是惊人。关键是都在鼓吹 NPM 有多先进。不能理解,但还是得用。
rrfeng
2018-04-19 12:23:57 +08:00
就不说我们一个项目有 800M 了...(为了安全只能把 modules 也打包进去)

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

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

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

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

© 2021 V2EX