NodeJS中module.exports和exports的区别
文章目录
前言
在使用NodeJS时,我们经常会碰到module.exports和exports
,那他们到底有什么区别呢?
一、简单示例
1. 用 module.exports 导出
// module.js 文件
function Foo() {
this.tag= "foo";
this.show = function() {
console.log("show", this.tag);
}
};
module.exports = Foo;
在同目录下创建 test.js,内容如下:
// test.js 文件
var mod = require('./module.js');
console.log(mod) // 打印: [Function: Foo]
var f = new mod();
f.show(); // 打印: "show foo"
2. 用 exports 导出
还是同一个 module.js 文件,但导出使用 exports
(1) 第一种导出方式 exports = Foo
// module.js 文件
function Foo() {
this.tag= "foo";
this.show = function() {
console.log("show", this.tag);
}
};
exports = Foo;
test.js文件,修改如下:
// test.js 文件
var mod = require('./module.js');
console.log(mod) // 打印: {}
竟然打印是空对象 { }
(2) 第二种导出方式 exports.foo = Foo
再次修改 module.js 文件
// module.js 文件
function Foo() {
...
};
exports.foo = Foo;
执行 node test.js 后, 打印 { foo: [Function: Foo] }
二、区别
通过上面的示例,可以发现:
module.exports
返回的是当前模块本身,即 赋值的是什么类型,require(…) 得到的就是什么类型。
而exports
并不是这样。
1.module.exports 和 exports 内置对象
nodeJS 执行一个JS文件时,会给这个JS文件内置两个
exports
和module
对象
console.log(exports); // 输出: {}
console.log(module); // 输出: Module {id: '.', path: 'xxx', ... exports: {}, ...}
console.log(module.exports === exports); // 输出: true, 说明指向同一块内存空间
可见,module.exports
和 exports
默认都是一个空对象{ },都是指向同一块内存空间。
2. require()到底指向那个内存空间
//demo.js
// 对 module.exports 和 exports 分别赋值为不同对象
module.exports = {name: 'module'};
exports = {name: 'exports'};
通过上面的赋值后,
module.exports
与exports
指向了两个不同的内存空间
在同一目录下创建 test.js,内容如下:
var demo = require('./demo');
console.log(demo);
执行后,打印: {name: ‘module’}
可见,require() 导出的内容是
module.exports
指向的内存空间, 而并非exports
的。
因此,当 module.exports 和 exports 指向不同的内存空间时,exports 的内容就会失效。