详解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中常用编程知识
Apr 08 Javascript
iframe调用父页面函数示例详解
Jul 17 Javascript
get(0).tagName获得作用标签示例代码
Oct 08 Javascript
jQuery获得document和window对象宽度和高度的方法
Mar 25 Javascript
Bootstrap每天必学之栅格系统(布局)
Nov 25 Javascript
在Javascript操作JSON对象,增加 删除 修改的简单实现
Jun 02 Javascript
AngularJS 路由详解和简单实例
Jul 28 Javascript
Angular.js实现获取验证码倒计时60秒按钮的简单方法
Oct 18 Javascript
layui 弹出层回调获取弹出层数据的例子
Sep 02 Javascript
javascript设计模式 ? 解释器模式原理与用法实例分析
Apr 17 Javascript
OpenLayers实现图层切换控件
Sep 25 Javascript
原生JS实现音乐播放器
Jan 26 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
第六节--访问属性和方法
2006/11/16 PHP
laravel自定义分页效果
2017/07/23 PHP
Yii框架响应组件用法实例分析
2019/09/04 PHP
prototype Element学习笔记(篇一)
2008/10/26 Javascript
Prototype Hash对象 学习
2009/07/19 Javascript
一个简单的js鼠标划过切换效果
2010/06/30 Javascript
extjs之去除s.gif的影响
2010/12/25 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
2015/09/12 Javascript
JavaScript实现简单的日历效果
2016/09/25 Javascript
angularjs中ng-attr的用法详解
2016/12/31 Javascript
在vue中,v-for的索引index在html中的使用方法
2018/03/06 Javascript
JSONP原理及应用实例详解
2018/09/13 Javascript
ES6中异步对象Promise用法详解
2019/07/31 Javascript
深入浅析golang zap 日志库使用(含文件切割、分级别存储和全局使用等)
2020/02/19 Javascript
[58:32]EG vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
[01:11:35]Liquid vs LGD 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python实现的防DDoS脚本
2011/02/08 Python
python正则表达式re模块详细介绍
2014/05/29 Python
Python中使用Inotify监控文件实例
2015/02/14 Python
python中enumerate函数遍历元素用法分析
2016/03/11 Python
python获取当前用户的主目录路径方法(推荐)
2017/01/12 Python
LRUCache的实现原理及利用python实现的方法
2017/11/21 Python
详解TensorFlow在windows上安装与简单示例
2018/03/05 Python
python接口自动化测试之接口数据依赖的实现方法
2019/04/26 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
2019/07/08 Python
使用Python实现NBA球员数据查询小程序功能
2020/11/09 Python
全球最大的户外用品零售商之一:The House
2018/06/12 全球购物
运行时异常与一般异常有何异同?
2014/01/05 面试题
迟到检讨书900字
2014/01/14 职场文书
税务会计岗位职责
2014/02/18 职场文书
文秘求职信范文
2014/04/10 职场文书
物理课外活动总结
2014/08/27 职场文书
《七律·长征》教学反思
2016/02/16 职场文书
初中思品教学反思
2016/02/20 职场文书
学者《孟子》名人名言
2019/08/09 职场文书
centos7安装mysql5.7经验记录
2022/05/02 Servers