导出对象如何引用 Node.js 中的 module.exports?
How does exports object reference module.exports in Node.js?
在Node.js中,模块对象包含一个导出属性,这是一个空对象。这个对象可以用来引用module.exports(exports.a = "A";),除非它被重新赋值(module.exports = "one";).
我的问题是 - 是什么使这个导出对象引用 module.exports?
CommonJS 模块实际上非常简单:将所有代码放在一个文件中,然后将其包装在一个函数中。执行函数,return执行后module.exports
的值给调用者
你可以在node.js source code中看到这个函数的header:
const wrapper = [
'(function (exports, require, module, __filename, __dirname) { ',
'\n});'
];
包装器应用于 require
文件中的代码,然后调用 like this:
const exports = this.exports;
const thisValue = exports;
const module = this;
if (requireDepth === 0) statCache = new Map();
if (inspectorWrapper) {
result = inspectorWrapper(compiledWrapper, thisValue, exports,
require, module, filename, dirname);
} else {
result = compiledWrapper.call(thisValue, exports, require, module,
filename, dirname);
}
如您所见,它非常简单。 const exports = this.exports
,然后 exports
作为参数传递给包装函数 - 因此它们最初指向相同的值,但如果您重新分配其中一个,它们将不再指向。
在Node.js中,模块对象包含一个导出属性,这是一个空对象。这个对象可以用来引用module.exports(exports.a = "A";),除非它被重新赋值(module.exports = "one";).
我的问题是 - 是什么使这个导出对象引用 module.exports?
CommonJS 模块实际上非常简单:将所有代码放在一个文件中,然后将其包装在一个函数中。执行函数,return执行后module.exports
的值给调用者
你可以在node.js source code中看到这个函数的header:
const wrapper = [ '(function (exports, require, module, __filename, __dirname) { ', '\n});' ];
包装器应用于 require
文件中的代码,然后调用 like this:
const exports = this.exports; const thisValue = exports; const module = this; if (requireDepth === 0) statCache = new Map(); if (inspectorWrapper) { result = inspectorWrapper(compiledWrapper, thisValue, exports, require, module, filename, dirname); } else { result = compiledWrapper.call(thisValue, exports, require, module, filename, dirname); }
如您所见,它非常简单。 const exports = this.exports
,然后 exports
作为参数传递给包装函数 - 因此它们最初指向相同的值,但如果您重新分配其中一个,它们将不再指向。