Node.js中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 的内容就会失效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值