了解NodeJS中的导出

我不认为我很了解如何exportsNode.js中工作。 在一些示例代码中,我注意到了以这种方式使用的exports对象:

 exports = mongoose = require('mongoose') mongoose.connect(config.db.uri) exports = Schema = mongoose.Schema 

当你使用exports =幕后两次发生的事情是什么? 在我看来,像“mongoose”不应该出口。 我做了这个快速testing:

 var foo , bar exports = foo = 'foo' exports = bar = 'bar' // reports 'bar' only console.log(exports) 

第二个testing覆盖第一个输出。

我的猜测是该示例代码的原始作者对module.exports vs exports感到困惑。 要使用exports对象,您必须像这样添加属性:

 exports.size = 42; 

如果将exports variables重新分配给一个新对象,则基本上无法访问node.js为您提供的全局导出对象。 如果你这样做两次或三次或N次,效果是一样的。 没用的。 例如:mod_b.js

 var realExports = exports; realExports.height = 42; var exports = {}; exports.weight = 43; 

并在mod_a.js

 var mod_b = require('./mod_b'); console.dir(mod_b); 

运行node mod_a.js ,你会得到:

 { height: 42 } 

注意height在那里,但weight不是。 现在,你可以做的是将module.exports为一个对象,这是当另一个模块require你的模块时将返回的对象。 所以你会看到像。

 var x = 10; var y = 20; module.exports = {x: x, y: y}; 

哪个会做你期望的。 这里有一些关于细节的资讯性文章。

Node.js模块 – 导出与module.exports

NodeJS module.exports的目的是什么?你如何使用它?

掌握节点

作为@ Peter-Lyons的扩展,你的例子是有效的,你的testing用例是不正确的。

不build议像这样导出variables,但是通过这样做,您可以将这些variables暴露给全局名称空间。

如test0.js

 'use strict'; var assert = require('assert'); var test1 = require('./test1'); assert(globalVar1 === 123); assert(globalVar2.a === 123); 

test1.js – 介意缺less'use strict';

 exports = globalVar1 = 123; exports = globalVar2 = {a:123}; 

再一次,这是有效的,但不build议。

干杯。