导出对象如何引用 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 作为参数传递给包装函数 - 因此它们最初指向相同的值,但如果您重新分配其中一个,它们将不再指向。