V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
FrankFang128
V2EX  ›  Node.js

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

  •  4
     
  •   FrankFang128 · 2018-04-19 01:12:14 +08:00 · 17623 次点击
    这是一个创建于 2443 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原文在知乎,欢迎交(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;
    };
    

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

    • is-plain-object,每周下载量 330 万
    • is-primitive,每周下载量 350 万,源代码你自己可以看看
    • isobject,每周下载量 750 万

    需要指出的是

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

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

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

    105 条回复    2018-08-30 08:27:40 +08:00
    1  2  
    quxiangxuanqxx
        101
    quxiangxuanqxx  
       2018-04-20 12:09:59 +08:00
    @FrankFang128 #79 很明显的逻辑问题

    is-odd 下载量高就能推导出大部分 JS 程序员不会奇数判断

    is-number 下载量高是不是也能推导出 JS 程序员不会判断数字?

    这个论据不足以支撑这个结论

    你要是想得出 大部分 JS 程序员会不会判断奇数,你应该拿数据说话

    现在程序员得出结论都这么信口开河吗?

    要不要直接得出大部分东北人都是社会人,大部分偷井盖的都是河南人的论调?

    没过脑子乱开地图炮这就是你的不对了

    好好讨论技术不行?还是就是想搞热点?
    hoyixi
        102
    hoyixi  
       2018-04-20 13:13:47 +08:00
    DRY 被提的比较多、比较早的是 Linux 和 Python 社区吧~

    Node 程序员 DRY 不 DRY 不清楚,但是很多包的源代码进去看看真是恶心的一比~

    当然这和 js 本身的语言特点有关,但是不得不说,js 程序员水平太参差不齐了
    FrankFang128
        103
    FrankFang128  
    OP
       2018-04-20 13:22:24 +08:00
    @quxiangxuanqxx 如果会判断奇数,为何又这么多下载 …… 用 % 就能解决的事情,我一直觉得 JS 社区整体素质不行,看我在 V2 以前的文章就知道了,总得来说我就是 Node 黑。 黑 Node 就是因为我也是用 JS 的,觉得需要有人出来指出这些毛病,就算我用词严厉也是为了让更多人知道。 你说过不够客观我当然是接受的。
    Mutoo
        104
    Mutoo  
       2018-04-21 09:09:31 +08:00
    不止是同一个功能的库有多个名称的问题,还有不同的库引用同一个库多个版本的问题。
    jiangnanyanyu
        105
    jiangnanyanyu  
       2018-08-30 08:27:40 +08:00 via Android
    什么参数都往函数里面丢,然后要保证正确性?是不是闭着眼睛写代码。。。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1017 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 20:40 · PVG 04:40 · LAX 12:40 · JFK 15:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.