Node.js模块导出exports 和 module.exports 的区别
来源:互联网 发布:淘宝客佣金终于追回了 编辑:程序博客网 时间:2024/05/17 04:06
每一个node.js执行文件,都自动创建一个module对象,同时,module对象会创建一个叫exports的属性,初始化的值是 {}
- 1
exports和module.exports指向同一块内存,但require()返回的是module.exports而不是exports。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
给 exports 赋值其实是给 module.exports 这个空对象添加了两个属性而已,上面的代码相当于:
- 1
- 2
- 3
- 4
- 5
先来看下exports和module.exports的使用
使用exports
app.js
- 1
- 2
log.js
- 1
- 2
- 3
- 4
使用module.exports
app.js
- 1
- 2
log.js
- 1
- 2
- 3
上述两种用法都没问题,但如果这样使用
- 1
- 2
- 3
运行程序就会报错。
前面的例子中给 exports 添加属性,只是对 exports 指向的内存做了修改。而上例则是对exports指向的内存进行了覆盖,使exports指向了一块新的内存,这样,exports和module.exports指向的内存并不是同一块,exports和module.exports并无任何关系。exports指向的内存有了变化,而module.exports指向的内存并无变化,仍为空对象{}。
require得到的会是一个空对象,则会有
- 1
报错信息。
再看下面的例子
app.js
- 1
- 2
- 3
- 4
init.js
- 1
- 2
运行app.js会有输出
- 1
这也就是module.exports对象不为空的时候exports对象就自动忽略,因为module.exports通过赋值方式已经和exports对象指向的变量不同了,exports对象怎么改和module.exports对象没关系了。
- 1
等价于
- 1
- 2
原因也很简单, 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
- Node.js模块导出exports 和 module.exports 的区别
- Node.js模块导出exports 和 module.exports 的区别
- Node.js模块导出exports 和 module.exports 的区别
- Node.js模块导出exports 和 module.exports 的区别
- Node.js的模块导出exports 和 module.exports 的区别
- 【Node.js】module.exports和exports的区别与使用
- Node.js中的module.exports和exports的区别
- node.js中module.exports和exports的区别
- node exports 和 module.exports 的区别
- Node.js中require、exports、module模块的区别
- [NODE之一]模块的exports和module.exports
- Node.js中exports与module.exports的区别
- Node.js中module.exports与exports的区别
- Node.js: exports与module.exports的区别
- node.js中module.exports与exports的区别
- Node.js中exports和module.exports
- Node.js Module – exports 和module.exports之间的联系与区别
- Node.js的module.exports与exports
- Leetcode之Set Matrix Zeroes 问题
- JDK中最常用的六个包
- 基于vue快速搭建开发框架
- Python标识符没有$
- angular入门1
- Node.js模块导出exports 和 module.exports 的区别
- Ajax -- $.post() 方法解析 JSON 数据
- 使用STM32CubeMX对SHT20温度湿度传感器每秒进行一次数据读取(硬件IIC)
- 上拉电阻,下拉电阻
- 数据结构与算法-基础数据结构(链表)
- 用小学数学来看待ECDH算法
- JZOJ5385. 【NOIP2017提高A组模拟9.23】Carry 树上倍增
- 爬虫学习3.2 HTTP请求的python实现--urllib2/urllib实现
- unity3d中的物体,在Scene窗口中可以看到,而在Game窗口中看不到