exprots和module.exprots的详解

一般我们使用require 用来加载代码,而 exportsmodule.exports 则用来导出代码

在Nodejs中,每一个node.js执行文件,都自动创建一个module对象,同时,module对象会创建一个叫exports的属性,初始化的值是 {},module.exports = {};

Node.js在模块编译的过程中会对模块进行包装,最终会返回类似下面的代码:

(function (exports, require, module, __filename, __dirname) {
    // module code...
});

其中,module就是这个模块本身,require是对Node.js实现查找模块的模块Module._load实例的引用,__filename和__dirname是Node.js在查找该模块后找到的模块名称和模块绝对路径,这就是官方API里头这两个全局变量的来历。

区别

模块内部是这样:exports = module.exports = {};

  • exports是module.exports的一个引用
  • require引用模块后,返回给调用者的是module.exports而不是exports
  • exports.xxx,相当于在导出对象上挂属性,该属性对调用模块直接可见
  • exports =相当于给exports对象重新赋值,调用模块不能访问exports对象及其属性
  • 如果此模块是一个类,就应该直接赋值module.exports,这样调用者就是一个类构造器,可以直接new实例

exports是引用 module.exports的值。module.exports 被改变的时候,exports不会被改变,而模块导出的时候,真正导出的执行是module.exports,而不是exports。

举例

//1.js
 exports.a = function(){
  console.log('a')
 }
 module.exports = {a: 2}
 exports.a = 1 

运行这个文件

//2.js
 var x = require('./1.js');
 console.log(x.a)

最后结果是 2

最后

  • 对于要导出的属性,可以简单直接挂到exports对象上
  • 对于类,应该挂到module.exports对象上,不要和导出属性值混在一起
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容