详解Node.js中exports和module.exports的区别


Posted in Javascript onApril 19, 2017

今天看了下node.js的require方法的源码,终于搞清楚exports和module.exports的区别了。

我们知道,node.js的模块暴露有两种方法。

1. 方式一:用exports

//a.js

 exports.log =function (str) {
  console.log(str);
}
//b.js

 var s = require("./a");
 s.log("哈哈哈哈");

2. 方式二:用module.exports

//a.js
 module.exports = function (str) {
    console.log(str);
 }

//b.js
 var s = require("./a");
 s("嘻嘻嘻嘻");

如果将第一种方式的exports按照第二种方式写成下面这样就会出错:

//a.js
 exports = function (str) {
  console.log(str);
}
//b.js

 var s = require("./a");
 s("哈哈哈哈");

exportsmodule.exports的初始值指向的是空对象,即{}。从源码可以看到,其实模块的require方法实质上是调用了_load方法,而_load方法,最终返回的是module.exports

详解Node.js中exports和module.exports的区别

详解Node.js中exports和module.exports的区别 

来分析一下出错的原因。

由于最开始的时候,exportsmodule.exports都指向同一个对象。

第一种方式,是在给这个空对象{}添加属性,又因为module.exports也是指向这个对象的,所以最终require方法返回的module.exports是指向了这个具有log方法的对象的,可以引用到模块。

第二种方式是让module.exports指向一片新的内存空间,exports指向的仍然是{},但是由于require方法返回的是module.exports,所以最终也能引入模块。

但是最后那种写法是让exports指向一片新的内存空间,module.exports指向的仍然还是{},那么最终require方法是将module.exports返回,所以会导致报错,说s不是一个function。

所以:

请牢记:require方法返回的是module.exports

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS URL传中文参数引发的乱码问题
Sep 02 Javascript
用js写了一个类似php的print_r输出换行功能
Feb 18 Javascript
onkeydown事件解决按回车键直接提交数据的需求
Apr 11 Javascript
js弹出窗口之弹出层的小例子
Jun 17 Javascript
js限制文本框只能输入整数或者带小数点的数字
Apr 27 Javascript
javascript的理解及经典案例分析
May 20 Javascript
深入解析JavaScript中的立即执行函数
May 21 Javascript
Bootstrap中glyphicons-halflings-regular.woff字体报404错notfound的解决方法
Jan 19 Javascript
使用JS编写的随机抽取号码的小程序
Aug 11 Javascript
微信小程序实现给嵌套template模板传递数据的方式总结
Dec 18 Javascript
js数组方法reduce经典用法代码分享
Jan 07 Javascript
微信小程序实现工作时间段选择
Feb 15 Javascript
jQuery ajax请求struts action实现异步刷新
Apr 19 #jQuery
JS正则验证多个邮箱完整实例【邮箱用分号隔开】
Apr 19 #Javascript
微信小程序 登录的简单实现
Apr 19 #Javascript
微信小程序开发入门基础教程
Apr 19 #Javascript
微信小程序教程系列之视图层的条件渲染(10)
Apr 19 #Javascript
JS实现AES加密并与PHP互通的方法分析
Apr 19 #Javascript
vue2.0父子组件间通信的实现方法
Apr 19 #Javascript
You might like
CI框架Session.php源码分析
2014/11/03 PHP
php+mysql查询优化简单实例
2015/01/13 PHP
对比PHP对MySQL的缓冲查询和无缓冲查询
2016/07/01 PHP
jQuery JSON实现无刷新三级联动实例探讨
2013/05/28 Javascript
js为鼠标添加右击事件防止默认的右击菜单弹出
2013/07/29 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
javascript引用赋值(地址传值)用法实例
2015/01/13 Javascript
JavaScript原生对象之String对象的属性和方法详解
2015/03/13 Javascript
jquery通过closest选择器修改上级元素的方法
2015/03/17 Javascript
jQuery中next方法用法实例
2015/04/24 Javascript
理解javascript定时器中的单线程
2016/02/23 Javascript
浅谈javascript中的constructor
2016/06/08 Javascript
jQuery实现ajax的叠加和停止(终止ajax请求)
2016/08/08 Javascript
详解JavaScript中return的用法
2017/05/08 Javascript
微信小程序自定义组件
2017/08/16 Javascript
vue左侧菜单,树形图递归实现代码
2018/08/24 Javascript
vue router 传参获取不到的解决方式
2019/11/13 Javascript
TypeScript之调用栈的实现
2019/12/31 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
[04:11]DOTA2亚洲邀请赛小组赛第一日 TOP10精彩集锦
2015/01/30 DOTA
Python中几种导入模块的方式总结
2017/04/27 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
基于python实现ROC曲线绘制广场解析
2020/06/28 Python
python中id函数运行方式
2020/07/03 Python
详解用python -m http.server搭一个简易的本地局域网
2020/09/24 Python
美国折扣宠物药房:Total Pet Supply
2018/05/27 全球购物
爱尔兰电脑、家电和家具购物网站:Buy It Direct
2019/07/09 全球购物
实现向右循环移位
2014/07/31 面试题
LINUX下线程,GDI类的解释
2016/12/14 面试题
物业总经理助理岗位职责
2014/06/29 职场文书
监察局领导班子四风问题整改措施思想汇报
2014/10/05 职场文书
部门优秀员工推荐信
2015/03/24 职场文书
员工工作心得体会
2019/05/07 职场文书
SpringBoot中HttpSessionListener的简单使用方式
2022/03/17 Java/Android
Java 超详细讲解ThreadLocal类的使用
2022/04/07 Java/Android
讲解MySQL增删改操作
2022/05/06 MySQL