一般我们使用require
用来加载代码,而 exports
和 module.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对象上,不要和导出属性值混在一起