Expressjs JavaScript Fundamentals: exports = module.exports
Expressjs JavaScript Fundamentals: exports = module.exports = createApplication;
我不知道这个模式叫什么,如果我知道的话我会直接去查。
主要是如何工作的?(这段代码取自Express.js)
exports = module.exports = createApplication;
我以前见过类似的模式,那里有这种类型的引用变量链,例如:
x = y = z
我理解出口和模块。但是看看上面的模式,我不禁要问它到底是如何工作的。
我按照一般的经验法则去做。Exports '是真正的交易,而' Exports '是它的助手,更多信息在这里
模块模式是这样的吗(不改变module.exports)?
exports = module.exports = {};
,
exports.name = 'hello'
结果exports = module.exports = {name: 'hello'}
当您更改导出的引用时会发生什么?
exports = {name: 'bob'}
现在当你添加到exports时,它将引用' {name: 'bob'},并且不再与module.exports有任何关系。
你的直觉是正确的。我将从下到上:
Node.js包装器
在运行任何文件之前,Node.js将整个脚本封装在立即调用的函数表达式(IIFE)中:
(function (exports, require, module, __filename, __dirname) {
// ...script goes here...
});
这就是它如何将module
和exports
变量引入作用域;它们只不过是函数的参数而已。
使用exports
关于module.exports
和exports
别名的Node.js文档非常有帮助。首先,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
的引用。但是如果继续阅读,您会注意到除了构造函数之外,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...
}
- 为什么要对define.md和module.exports进行条件检查,以及条件何时通过
- 在jasmine规范中使用module.exports
- 我们可以在一个js文件中有多个module.exports语句吗
- module.exports一个jQuery插件
- “module.exports.instance”是什么意思
- Module.exports通过Mongoose调用返回undefined
- 我可以在Node中以编程方式更改.js文件的module.exports中的JSON对象吗
- 使用module.exports和ES6导出导入
- 调用module.exports上的函数时发生CommonJS非法调用错误
- 如何从module.exports访问函数
- 为什么在定义导出属性之前调用module.exports时仍然有效
- “var self = module.exports;”是什么意思
- this.prototype 和 module.exports 之間的差異
- 我们如何在nodeJS中使用module.exports返回函数
- 在定义foo之前放置“module.exports = foo”是如何工作的
- module.exports scope and node-mysql
- require():使用 module.exports vs 直接分配给 “this”
- Node.js/MongoDB:如何使用module.exports将本地主机数据库URL传递给服务器.js文件
- NodeJS prototyping with module.exports
- Expressjs JavaScript Fundamentals: exports = module.exports