Node.js模块导出exports 和 module.exports 的区别

 我来答
就烦条0o
2016-12-23 · 知道合伙人软件行家
就烦条0o
知道合伙人软件行家
采纳数:33315 获赞数:46493
从事多年系统运维,喜欢编写各种小程序和脚本。

向TA提问 私信TA
展开全部
每一个node.js执行文件,都自动创建一个module对象,同时,module对象会创建一个叫exports的属性,初始化的值是 {}

module.exports = {};11

exports和module.exports指向同一块内存,但require()返回的是module.exports而不是exports。

var str = "difference"
exports.a = str;
exports.b = function () {

}

12345671234567

给 exports 赋值其实是给 module.exports 这个空对象添加了两个属性而已,上面的代码相当于:

var str = "difference"
module.exports.a = str;
module.exports.b = function () {

}1234512345

先来看下exports和module.exports的使用

使用exports

app.js

var s = require("./log");
s.log("hello");1212

log.js

exports.log =function (str) {
console.log(str);
}12341234

使用module.exports

app.js

var s = require("./log");
s.log("hello");1212

log.js

module.exports =function (str) {
console.log(str);
}123123

上述两种用法都没问题,但如果这样使用

exports = function (str) {
console.log(str);
}123123

运行程序就会报错。

前面的例子中给 exports 添加属性,只是对 exports
指向的内存做了修改。而上例则是对exports指向的内存进行了覆盖,使exports指向了一块新的内存,这样,exports和module.exports指向的内存并不是同一块,exports和module.exports并无任何关系。exports指向的内存有了变化,而module.exports指向的内存并无变化,仍为空对象{}。

require得到的会是一个空对象,则会有

TypeError: s.log is not a function11

报错信息。

再看下面的例子

app.js

var x = require('./init');

console.log(x.a)
12341234

init.js

module.exports = {a: 2}
exports.a = 1 1212

运行app.js会有输出

211

这也就是module.exports对象不为空的时候exports对象就自动忽略,因为module.exports通过赋值方式已经和exports对象指向的变量不同了,exports对象怎么改和module.exports对象没关系了。

exports = module.exports = somethings11

等价于

module.exports = somethings
exports = module.exports1212

原因也很简单, module.exports = somethings 是对 module.exports 进行了覆盖,此时
module.exports 和 exports 的关系断裂,module.exports 指向了新的内存块,而 exports
还是指向原来的内存块,为了让 module.exports 和 exports 还是指向同一块内存或者说指向同一个 “对象”,所以我们就
exports = module.exports 。

最后,关于exports和module.exports的关系可以总结为

module.exports 初始值为一个空对象 {},所以 exports 初始值也是 {}
exports 是指向的 module.exports 的引用
require() 返回的是 module.exports 而不是 exports
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式