我不知道这个模式叫什么,如果我这样做,我会直接查找。
主要是,这是如何工作的? (此代码取自Express.js)
exports = module.exports = createApplication;
我之前看到类似的模式,之前有这种类型的引用变量链ex:
x = y = z
我理解export vs module.exports但是看看上面的模式让我对它的实际工作方式提出疑问。
我按照一般的经验法则来说,' module.exports'是真正的交易,出口'是它的帮手,更多关于这个here
模块模式是这样的(不改变module.exports)吗?
exports = module.exports = {};
例如:
exports.name = 'hello'
结果
exports = module.exports = {name: 'hello'}
更改出口参考时会发生什么?
exports = {name: 'bob'}
现在当你添加到导出时,它会引用`{name:' bob'}并且不再与module.exports有任何联系?
答案 0 :(得分:2)
你的直觉是正确的。我会自下而上地工作:
在运行任何文件之前,wraps the entire script中的Node.js immediately-invoked function expression (IIFE):
(function (exports, require, module, __filename, __dirname) {
// ...script goes here...
});
这是将module
和exports
变量引入范围的方法;它们并不比函数参数更特殊。
exports
module.exports
上的Node.js文档和exports
别名非常有帮助。首先,module.exports
和exports
变量都引用模块系统创建的同一个空对象。
如果模块只需要导出一个设置了一些属性的普通旧JavaScript对象,那么exports
就是所需要的:
exports.get = function(key) {
// ...
};
exports.set = function(key, value) {
// ...
};
当代码require()
成为此模块时,结果将类似于:
{
get: [Function],
set: [Function]
}
module.exports
但是,Express会将构造函数createApplication
导出为根值。要导出函数本身,而不是仅将其分配给导出对象上的属性,它必须首先完全替换导出的对象:
module.exports = createApplication;
现在,exports
尚未更新,仍然引用旧对象,而module.exports
是对createApplication
的引用。但是if you keep reading,除了构造函数之外,你还会注意到Express会导出其他几个属性。虽然将这些属性分配给module.exports
的新值就足够了,但重新分配exports
以便它再次成为module.exports
的别名更短,然后分配这些属性exports
,相当于在module.exports
上分配它们。
因此,这些例子在功能上是等价的:
module.exports = createApplication;
function createApplication() {
// ...
}
module.exports.application = proto;
module.exports.request = req;
module.exports.response = res;
但这一点不那么冗长:
exports = module.exports = createApplication;
function createApplication() {
// ...
}
exports.application = proto;
exports.request = req;
exports.response = res;
无论哪种方式,结果都是相同的,在根上名为createApplication
的函数,其上有可用的属性:
{
[Function: createApplication]
application: [Object],
request: [Object],
response: [Object],
// ...a few other properties...
}