exports和module.exports

Posted by zhangyingji on March 18, 2019

写在前面

官网是这么建议的,如果你怕混淆,只用module.exports就好了。

要点

  1. exports是指向的module.exports的引用
  2. module.exports初始值为一个空对象{},故exports也为{}

知道exportsmodule.exports的引用,则可知

  • exports被完全替换时,则不再指向module.exports
  • module.exports被完全替换时,exports不会改变
console.log(module.exports === exports) // 初始化 true 

exports = module.exports // 让 exports 重新指向 module.exports

进一步

值得注意的是:require()返回module.exports

module.exports.hello = true; // 被导出
exports = { hello: false };  // 没有被导出

这种情况可以通过模拟require说明

function require() {
  const module = {
    exports: {}
  };
  
  // 修改exports只在内部起作用,无法影响到外部module.exports
  ((module, exports) => {
    // Module code here. In this example, define a function.
    function someFunc() {}
    exports = someFunc;
    // At this point, exports is no longer a shortcut to module.exports, and
    // this module will still export an empty default object.
    module.exports = someFunc;
    // At this point, the module will now export someFunc, instead of the
    // default object.
  })(module, module.exports);
  
  return module.exports;
}