我不认为我完全理解exports
在 Node.js 中的工作方式。在一些示例代码中,我注意到以这种方式使用的exports
对象:
exports = mongoose = require('mongoose')
mongoose.connect(config.db.uri)
exports = Schema = mongoose.Schema
当您使用exports =
两次时,幕后发生了什么?在我看来像是" mongoose"不应该出口。我做了这个快速测试:
var foo
, bar
exports = foo = 'foo'
exports = bar = 'bar'
// reports 'bar' only
console.log(exports)
并且第二个测试会覆盖第一个导出。
答案 0 :(得分:15)
我的猜测是该示例代码的原作者对module.exports
vs exports
感到困惑。要使用exports
对象,必须像这样添加属性:
exports.size = 42;
如果将exports
变量重新分配给新对象,则基本上无法访问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 vs module.exports
What is the purpose of NodeJS module.exports and how do you use it?
答案 1 :(得分:1)
作为@ Peter-Lyons答案的扩展,您的示例有效,您的测试用例不正确。
不推荐像这样导出变量,但通过这样做,您将这些变量暴露给全局命名空间。
e.g。 test0.js
'use strict';
var assert = require('assert');
var test1 = require('./test1');
assert(globalVar1 === 123);
assert(globalVar2.a === 123);
test1.js - 请注意缺少的'use strict';
exports = globalVar1 = 123;
exports = globalVar2 = {a:123};
再一次,这是有效的,但不推荐。
干杯。