在使用NodeJS时,我们经常会碰到module.exports和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"
还是同一个 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
并不是这样。
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
默认都是一个空对象{ },都是指向同一块内存空间。
//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 的内容就会失效。