exports和module.exports的区别?

exports和module.exports有区别吗?

如题, 当我们使用exports和module.exports的时候, 通常exports.a = 123 和module.exports.a = 123是一回事, 笔者也看过一些资料中说到exports和module.exports是没有什么区别的, 结果真是这样吗?

我们先来看看exports和module.exports的真身到底是什么?

console.log(module.exports, exports);
console.log(module.exports === exports);
//

在这里插入图片描述

由上图可以得知, module.exports和exports本质上就是一个空对象{}, 同时我们还发现这两个对象相等为true, 那也就是意味着module.exports和exports指向的是同一个地址

于是笔者又进行了如下的测试(test.js)

const a = 123;
const b = 234;

exports.a = a; // 导出a变量
module.exports.b = b; // 导出b变量

在另一个文件夹中导入该文件(index.js)

const exportsObj = require('./test.js'); 
console.log(exportsObj); 

在这里插入图片描述

输出结果为{a: 123, b: 234}, 看起来没毛病, 那么既然这两个对象又相等, 而我们导出的时候又互不干扰, 是不是可以判断他们没什么区别了呢, 很显然非也

当我们把代码写成如下格式的时候, 问题来了

const a = 123;
const b = 234;

exports = a; // 导出a变量
module.exports = b; // 导出b变量

index区域代码不变, 则输出结果如下

在这里插入图片描述

我们只看到了一个234, 发生这种情况的原因我看了一些博客中写是因为module.exports会覆盖exports, 其实我们从对象的基础知识来看或许剖析的比较全面

一开始 module.exports 和 exports 指向了同一个空对象 {},
当我们改变了 exports的值 让他指向另外一个值以后, 他就已经不再跟module.exports相等了,
而系统会默认识别module.exports导出的内容, 所以exports 只是相当于我们给未声明变量赋了一个值

所以防止exports被弃用, 建议大家尽量都写module.exports

发布了33 篇原创文章 · 获赞 11 · 访问量 2256

猜你喜欢

转载自blog.csdn.net/weixin_44238796/article/details/103961159
今日推荐