繁体   English   中英

Expressjs JavaScript Fundamentals:exports = module.exports = createApplication;

[英]Expressjs JavaScript Fundamentals: exports = module.exports = createApplication;

我不知道这个模式叫什么,如果我这样做,我会直接查找。

主要是,这是如何工作的? (此代码取自Express.js)

exports = module.exports = createApplication;

在有这种类型的引用变量链ex之前我见过类似的模式:

x = y = z

我理解export vs module.exports,但是看看上面的模式让我对它的实际工作方式提出质疑。

我按照一般的经验法则说'module.exports'是真正的交易,'exports'是它的帮手,更多关于这里

模块模式是这样的(不改变module.exports)吗?

exports = module.exports = {};

例如:

exports.name = 'hello' 

结果

exports = module.exports = {name: 'hello'}

更改出口参考时会发生什么?

exports = {name: 'bob'}

现在当你添加到导出时,它将引用`{name:'bob'}并且不再与module.exports有任何联系?

你的直觉是正确的。 我会自下而上地工作:

Node.js Wrapper

在运行任何文件之前,Node.js 将整个脚本包装在一个立即调用的函数表达式(IIFE)中

(function (exports, require, module, __filename, __dirname) {
    // ...script goes here...
});

这就是它如何引入module并将变量exports到范围中; 它们并不比函数参数更特殊。

使用exports

module.exports上的Node.js文档和exports别名非常有用。 首先, module.exportsexports变量都引用模块系统创建的同一个空对象。

如果一个模块只需要一个普通的旧JavaScript对象导出一些属性进行设置, exports是所有的需要:

exports.get = function(key) {
    // ...
};

exports.set = function(key, value) {
    // ...
};

当代码require() s这个模块时,结果将类似于:

{
    get: [Function],
    set: [Function]
}

替换module.exports

但是,Express createApplication构造函数createApplication作为根值createApplication 要导出函数本身,而不是仅将其分配给导出对象上的属性,它必须首先完全替换导出的对象:

module.exports = createApplication;

现在, exports尚未更新,仍然引用旧对象,而module.exports是对createApplication的引用。 但是如果你继续阅读 ,你会发现除了构造函数之外,Express还会导出其他几个属性。 虽然将这些属性分配给module.exports的新值就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...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM