NodeJS中module.exports和exports的区别

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文件内置两个 exportsmodule 对象

console.log(exports);    // 输出: {}
console.log(module);     // 输出: Module {id: '.',  path: 'xxx', ... exports: {}, ...}

console.log(module.exports === exports);    // 输出: true, 说明指向同一块内存空间

可见,module.exportsexports 默认都是一个空对象{ },都是指向同一块内存空间

2. require()到底指向那个内存空间

//demo.js
// 对 module.exports 和 exports 分别赋值为不同对象
module.exports = {name: 'module'};
exports        = {name: 'exports'};

通过上面的赋值后,module.exportsexports 指向了两个不同的内存空间

在同一目录下创建 test.js,内容如下:

var demo = require('./demo');
console.log(demo);

执行后,打印: {name: ‘module’}

可见,require() 导出的内容是 module.exports 指向的内存空间, 而并非 exports 的。

因此,当 module.exports 和 exports 指向不同的内存空间时,exports 的内容就会失效。

上一篇:【洛谷P1349】广义斐波那契数列【矩阵乘法】


下一篇:NYOJ 998 解题报告