# module.exports和exports的区别
Node模块允许你从被引入文件中选择要暴露给程序的函数和变量。如果模块返回的函数或变 量不止一个,那它可以通过设定exports对象的属性来指明它们。但如果模块只返回一个函数或变量,则可以设定module.exports属性。
# module和exports
// demo.js
console.log(module)
console.log(exports)
// 输出
Module {
id: '.',
exports: {},
parent: null,
filename:
'.../demo1.js',
loaded: false,
children: [],
paths:
[ ... ] }
{}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
module.exports和exports一开始都是一个空对象{},本质上这两个指向的是同一块内存,
# require
require引入的对象本质上是module.exports。这就产生了一个问题,当 module.exports和exports指向的不是同一块内存时,exports的内容就会失效。
最终在程序里导出的是module.exports。exports只是对module.exports的一个全 局引用,最初被定义为一个可以添加属性的空对象。如果把exports设定为别的,就打破了module.exports和exports之间的 引用关系。可是因为真正导出的是module.exports,那样exports就不能用了,因为 它不再指向module.exports了。如果你想维持那个链接,可以像下面这样让 module.exports再次引用exports。
// person.js
module.exports = {name: 'clearives'}
exports = {name: 'Mr、z'}
// demo.js
const person = require('./person')
console.log(person) // {name: 'clearives'}
module.exports = exports = {...};
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
参考: Node.js实战
← BASE64加/解密 多异步协作 →