在节点中.js“模块”始终是一个对象

In node.js is `module` always an object?

本文关键字:一个对象 模块 节点 js      更新时间:2023-09-26

当我看到如何检测脚本是在节点中运行还是在浏览器中运行时的示例时,我看到的逻辑如下:

if (typeof module !== 'undefined' && module.exports) {
    // do something that applies to node
} else {
    // do something that applies to browser
}

节点文档将全局module列为{Object},我认为这意味着typeof module应该始终"object"。这在节点中总是正确的吗?如果是这样,执行以下检测逻辑不是更有意义吗:

if (typeof module === 'object' && module.exports) {
    // do something that applies to node
} else {
    // do something that applies to browser
}

是的,到目前为止,在所有节点版本中,module 一直是一个对象,并且对于所有 0.x 版本都可能保持这种状态。至于检查它是否是一个特定的对象而不是未定义的对象是否有意义,这主要是风格问题。在前面的例子中,由于代码可能只关心向module.exports添加属性,因此它比编码更具表现力且不那么脆弱。例如,在节点的未来版本中,也许module成为一个函数。在这种情况下,前一个示例仍然有效,而后一个示例需要稍作更改。

第二个片段可能会正常工作。 但是,不,我认为这更有意义。 你更关心它的存在,而不是你关心它是什么。 在javascript中检查是否存在的标准方法是:

typeof myVar !== 'undefined'

所以这里有一些JS约定在起作用。