详解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 相关文章推荐
JavaScript 替换Html标签实现代码
Oct 14 Javascript
JavaScript Perfection kill 测试及答案
Mar 23 Javascript
jquery multiSelect 多选下拉框
Jul 09 Javascript
JS小数运算出现多为小数问题的解决方法
Jun 02 Javascript
Node.js下自定义错误类型详解
Oct 17 Javascript
js实现滑动到页面底部自动加载更多功能
Feb 15 Javascript
jQuery编写textarea输入字数限制代码
Mar 23 jQuery
Angular实现类似博客评论的递归显示及获取回复评论的数据
Nov 06 Javascript
使用bootstrap实现下拉框搜索功能的实例讲解
Aug 10 Javascript
ios设备中angularjs无法改变页面title的解决方法
Sep 13 Javascript
leaflet加载geojson叠加显示功能代码
Feb 21 Javascript
js实现简单的轮播图效果
Dec 13 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
PHP脚本数据库功能详解(上)
2006/10/09 PHP
ThinkPHP模板判断输出Defined标签用法详解
2014/06/30 PHP
phpstorm编辑器乱码问题解决
2014/12/01 PHP
在WordPress中使用PHP脚本来判断访客来自什么国家
2015/12/10 PHP
php框架CodeIgniter主从数据库配置方法分析
2018/05/25 PHP
使用laravel指定日志文件记录任意日志
2019/10/17 PHP
TP3.2.3框架使用CKeditor编辑器在页面中上传图片的方法分析
2019/12/31 PHP
jquery 锁定弹出层实现代码
2010/02/23 Javascript
jQuery获取当前对象标签名称的方法
2014/02/07 Javascript
JavaScript匿名函数与委托使用示例
2014/07/22 Javascript
基于Vue.js的表格分页组件
2016/05/22 Javascript
浅析JavaScript中的array数组类型系统
2016/07/18 Javascript
js实现加载更多功能实例
2016/10/27 Javascript
Node+Express+MongoDB实现登录注册功能实例
2017/04/23 Javascript
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
2018/02/08 Javascript
JS随机数产生代码分享
2018/02/24 Javascript
基于vue-video-player自定义播放器的方法
2018/03/21 Javascript
微信小程序实现聊天对话(文本、图片)功能
2018/07/06 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
在Layui中操作数据表格,给指定单元格添加事件示例
2019/10/26 Javascript
[02:34]肉山说——泡妞篇
2014/09/16 DOTA
[03:26]《DAC最前线》之EG经理自述DOTA2经历
2015/02/02 DOTA
python使用opencv按一定间隔截取视频帧
2018/03/06 Python
python使用turtle绘制分形树
2018/06/22 Python
Python中实现单例模式的n种方式和原理
2018/11/14 Python
对python产生随机的二维数组实例详解
2018/12/13 Python
使用pygame编写Flappy bird小游戏
2020/03/14 Python
python网络编程socket实现服务端、客户端操作详解
2020/03/24 Python
OpenCV 之按位运算举例解析
2020/06/19 Python
windows支持哪个版本的python
2020/07/03 Python
土耳其玩具商店:Toyzz Shop
2019/08/02 全球购物
乌克兰品牌化妆品和香水在线商店:Bomond
2020/01/14 全球购物
口头翻译求职人自荐信
2013/12/07 职场文书
四风问题自查报告剖析材料
2014/02/08 职场文书
工商局所长四风自我剖析及整改措施
2014/10/26 职场文书
2015年小学语文教学工作总结
2015/05/25 职场文书