关于模块和require,module,exports,module.exports的关系

require函数的伪代码:

const result = require('.myModule')
function require(modulePath) {
    // 1.modulePath转为绝对路径
    // 2.判断是否该模块已有缓存 如果有则返回缓存
    // 3.读取文件内容
    // 4.包裹到一个函数里面

  function __temp(module, exports,require, __dirname, __filename) {

    // 以下为modulePath文件内容
    console.log(__dirname, __filename);
    exports.c = 3;
  //错误写法  
    module.exports = {
      a: 1,
      b: 2,
    };
    this.m = 5;
  }

  module.exports = {};

  const exports = module.exports;

  __temp.call(
    module.exports,
    module,
    exports,
    require,
    module.path,
    module.filename
  );
}


 

 

当一个js文件被require的时候 module会自动传入进去,而且__temp会绑定module.exports,所以在js模块里面this === module.exports === exports   但是这三个最好不要混用   比如上面的错误代码混写 module.exports 赋值了一个新对象 会导致 module.exports 和 exports不相等  但是最后导出的是module.exports  导致后面再去改this和exports对象的值都不会导出  因为只会导出最后给module.exports赋值的对象。
上面代码不给module.exports赋值对象 就不会有问题  

module.exports.a = 1
module.exports.b = 2
所以module导出的时候 不要混用这三个就不会有问题
 
 
 

posted on 2024-05-23 16:30  龍瀧尨呀  阅读(2)  评论(0编辑  收藏  举报

导航