为什么在node.js v4.0.0中不推荐使用许多util.is *函数?

时间:2015-09-11 04:22:06

标签: javascript node.js

随着节点v4.0.0的发布。此版本的节点弃用了许多函数,例如util.isArrayutil.isRegEx,util。isDateutil.isBoolean等许多函数。

我想知道为什么这会发生在节点上?

ES6中有这些东西的原生支持吗?

或者节点是否提供了更好的解决方案而不是这些东西?

2 个答案:

答案 0 :(得分:26)

弃用util.is*()函数的决定最初是在2015年4月在Node.js技术指导委员会(TSC)进行的。那时,它仍然是io.js,但是相同委员会现在是Node.js TSC,他们谈论的代码库就是Node.js 4.0.0。

minutes from the meeting在线。所以你可以自己阅读,看看权衡的利弊。这几分钟内最明确的问题陈述可能来自Bert Belder:

  

我们想要弃用这些的原因是我们并不真的想要修复它,因为它会向后兼容,所以这真的太大而不能用于核心。

(不幸的是,在会议记录中似乎有一些缺失的上下文。我会看看我是否可以从其他来源挖掘更多的上下文,如果我发现任何有用的内容,我会更新这个答案。)

更新:从某些TSC minutes from Februarydiscussion in a pull request from the same month判断,似乎推理是这样的:

嘿,看起来util.isObject()会为函数返回false。这是不正确的。函数是一个对象。它应该返回true。但是,进行这种改变可能会破坏Node生态系统的很大一部分。想想npm上可能依赖于该行为的所有模块。为了不以惊人的方式冒险破坏生态系统,我们不得不以某种方式让很多人审查他们的代码。而突破性的变化将完全向后兼容。所有这些都是为了便利功能,它甚至不属于核心,并且易于由用户态模块提供。 (例如,参见core-util-is。)为了修复util.isObject()而不是引入一个突破性的变化和一个半主要的颠簸,让我们做首先应该做的事情,甚至不做它在核心。

我认为可能还有一种感觉,util.is*()函数中可能存在潜在的其他角落案例。

该项目的理念一般是拥有最小的核心。在所有条件相同的情况下,如果用户模块可以提供某些东西而不会有太多麻烦,它应该存在于用户态模块而不是核心。

好的,这是我从一些文本中得出了很多推论,但我认为这或多或少与弃用有关。

答案 1 :(得分:1)

不是node.js专家,但这些功能(如果他们按照名称所做的那样)可以很容易地替换为

[] instanceof Array; // true
/* or */ Array.isArray([]); // true

(/(?:)/g) instanceof RegExp; // true

new Date() instanceof Date; // true

new Boolean(true) instanceof Boolean; // true
/* or */ typeof false == 'boolean';
/* or even */ var bool1 = true, bool2 = false;
!!bool1 === bool1; // true
!!bool2 === bool2; // true

根据the changelog

  

已弃用util.is*()函数,从此版本的文档中的弃用警告开始,鼓励用户在npm注册表中寻找更强大的替代方案。

他们链接此pull request,其中包含导致this dialog的一些推理,说明:

  

我们想要弃用这些的原因是我们并不真的想要修复它,因为它会向后兼容,所以这真的太大而不能用于核心。

简而言之,这些功能在某种意义上是错误的,而不是修复错误和破坏向后兼容性,他们决定弃用它们。

如果您确实需要经常检查这些内容,可以根据需要编写自己的功能。