美文网首页
module.exports与exports的区别

module.exports与exports的区别

作者: 江疏影子 | 来源:发表于2018-09-07 14:48 被阅读0次

module

exports = module.exports = {}

所以module.exports和exports的区别就是var a={}; var b=a;,a和b的区别

当每个js文件在执行或被require的时候,NodeJS其实创建了一个新的实例var module = new Module(),这个实例名叫module。这也就是为什么你并没有定义module这个变量,却能console.log出来而不会报错的原因。

module的打印结果

module.exports

假如我们有一个js文件

module.exports = {
     print : function(){console.log(12345)}
};
console.log(exports);
console.log(module.exports)

打印结果如下

image.png
module.exports中已经有了print的方法,很容易理解module.exports其实是给Module(var module = new Module())实例中的exports对象中添加方法/属性。

exports

console.log(module); //你会看到Module中的exports为空对象{}
console.log(exports); //你会看到Module中的exports为空对象{}
module.exports = {
  print : function(){console.log(12345)}
}
console.log(module); //你会看到Module中的exports对象有了print()方法
exports.name = '小白妹妹';
console.log(module); //你会看到Module中的exports对象不仅有了print()方法,还有了name属性

由此也能看出,传说中的exports其实是module.exports的引用,你可以这么理解,NodeJS在你的代码之前悄悄的加了以下代码:
var module = new Module();
var exports = module.exports;
这也就是为什么你并没有定义exports这个变量,却能console.log出来而不会报错的原因。

  • exports 是 module.exports 的一个引用
  • module.exports 初始值为一个空对象 {},所以 exports 初始值也是 {}
  • require 引用模块后,返回的是 module.exports 而不是 exports!!!!!
  • exports.xxx 相当于在导出对象上挂属性,该属性对调用模块直接可见
  • exports = 相当于给 exports 对象重新赋值,调用模块不能访问 exports 对象及其属性
  • 如果此模块是一个类,就应该直接赋值 module.exports,这样调用者就是一个类构造器,可以直接 new 实例。
    引用:https://www.jianshu.com/p/e452203d56c4

require

当你从外部调用某个模块,require其实是在require什么?
require的时候NodeJS会到处去找有没有这个模块,如果有,return的就是module.exports里的东东。

相关文章

网友评论

      本文标题:module.exports与exports的区别

      本文链接:https://www.haomeiwen.com/subject/vwlcgftx.html