Node.js中exports与module.exports的区别
Posted 奔跑的蜗牛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Node.js中exports与module.exports的区别相关的知识,希望对你有一定的参考价值。
一、exports使用
test.js
exports.name = function() { console.log(\'张三\'); };
index.js使用
var test= require(\'./test.js\'); test.name(); // \'张三\'
错误用法
exports = function() { console.log(\'张三\'); };
这样相当于给exports对象重新赋值,不能导出,调用模块不能访问exports对象及其属性
说明
- exports对象实际上就是对module.exports的引用,exports只是它的一个辅助工具,最终返回给调用的是
Module.exports
而不是exports - 如果你没有显式的给
Module.exports
设置任何属性和方法,那么你的模块就是exports设置给Module.exports的
属性
二、module.exports使用
2.1 module.exports与exports使用顺序问题
test.js
module.exports = {name:\'张三\'}; exports.getName = function(){ console.log(\'李四\') };
index.js使用
var test = require(\'./test.js\'); console.log(test.name); // 输出结果 -> 张三 test.getName(); // Uncaught TypeError: test.getName is not a funtion
说明
- module.exports对象不为空的时候exports对象就自动忽略,因为module.exports通过赋值方式已经和exports对象指向的变量不同了,exports对象怎么改和module.exports对象没关系了
- 所有的exports收集到的属性和方法,都赋值给了
Module.exports
。当然,这有个前提,就是Module.exports
本身不具备任何属性和方法。
如果
Module.exports
已经具备一些属性和方法,那么exports收集来的信息将被忽略
2.2 使用module.exports导出一个类
person.js
module.exports = function(name, age) { this.name = name; this.age = age; this.about = function() { console.log(this.name +\' is \'+ this.age +\' years old\'); }; };
index.js 使用
var Person = require(\'./person.js\'); var p1 = new Test(\'张三\', 22); p1.about(); // 张三 is 22 years old
2.3 使用module.exports导出一个数组
test.js
module.exports = [\'a\', \'b\', \'c\', \'d\', \'e\'];
index.js 使用
var test = require(\'./test.js\'); console.log(test[2]); // c
2.4 常见使用方法解释
exports = module.exports = somethings
等价于
module.exports = somethings
exports = module.exports
说明
module.exports = somethings 是对 module.exports 进行了覆盖,此时 module.exports 和 exports 的关系断裂,module.exports 指向了新的内存块,而 exports 还是指向原来的内存块,为了让 module.exports 和 exports 还是指向同一块内存或者说指向同一个 “对象”,所以我们就 exports = module.exports 。
总结:
- exports是module.exports的一个引用
- require引用模块后,返回给调用者的是module.exports而不是exports
exports.xxx
,相当于在导出对象上挂属性,该属性对调用模块直接可见exports =
相当于给exports对象重新赋值,调用模块不能访问exports对象及其属性- 如果此模块是一个类,就应该直接赋值
module.exports
,这样调用者就是一个类构造器,可以直接new实例
参考资料
https://www.zhihu.com/question/26621212
以上是关于Node.js中exports与module.exports的区别的主要内容,如果未能解决你的问题,请参考以下文章
Node.js学习笔记(一)module.exports与exports
Node.js中exports与module.exports的区别
Node.js 和 ES6 中的 module.exports 与 export default
Node.js的学习入门(module.exports与exports)