我正在阅读其他一些代码,我看到了一段像这样的代码
if ( typeof module === 'object' ) {
module.exports = BBB;
}
我在想 1)为什么在这里使用if语句 2)使用module.exports时,是否意味着导出所有BBB名称空间
BTW,BBB是一个定义为的命名空间var BBB = {};
答案 0 :(得分:1)
该模块很可能适用于浏览器和服务器端(可能使用node.js)。
为您的模块创建一种包装器允许它在各种JavaScript加载器中使用,例如AMD或RequireJS或CommonJS(由节点使用)
我还建议查看umdjs/umd(通用模块定义)。此repo记录了如何为模块创建包装器,以便它可以在您定位的每个环境中工作。
最后,您可以将module.exports
视为函数的返回值。当有人导入模块时,导出就是给他们的。
如果使用
// bbb.js
module.exports = BBB;
当使用(例如)
需要模块时// otherfile.js
var BBB = require('./bbb');
BBB
将匹配导出的对象。
查看node.js module docs以获取更多常规帮助。
答案 1 :(得分:1)
它是检测你所处的环境,模块存在于节点中,但没有浏览器中没有浏览器之类的
答案 2 :(得分:1)
作者很可能正在创建一个可能不一定在CommonJS环境中使用的模块,但仍然提供支持。
CommonJS标准定义了一些自由变量,require
,exports
和module
。 module
必须是对象。
因此,当作者检查module
类型为object
时,他们必须检查CommonJS支持,然后他们将module.exports
分配给BBB
,以便当消费者require
的模块BBB
被返回时。我不会详细介绍CommonJS,但您可以查看standard了解更多信息。
为什么要检查CommonJS支持?
因为您的代码适用于多个环境/打包器。例如Browserify和Webpack使用CommonJS标准打包代码以便在浏览器中使用。但是,当为浏览器创建API时,应该假设消费者可能没有使用CommonJS,因此将不会定义module
,并且为module.exports
分配值将引发错误。
答案 3 :(得分:0)
1)这将检查您是否在服务器端使用此代码(NodeJS)。
2)是的,导出所有BBB名称空间
以下是所有必要信息:http://www.sitepoint.com/understanding-module-exports-exports-node-js/