详解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简单实现可拖动的div
Oct 22 Javascript
js创建一个input数组并绑定click事件的方法
Jun 12 Javascript
JavaScript获取某年某月的最后一天附截图
Jun 23 Javascript
JavaScript SHA512&SHA256加密算法详解
Aug 11 Javascript
Angular 4依赖注入学习教程之组件服务注入(二)
Jun 04 Javascript
JavaScript中最常用的10种代码简写技巧总结
Jun 28 Javascript
echarts学习笔记之图表自适应问题详解
Nov 22 Javascript
Node.js 使用AngularJS的方法示例
May 11 Javascript
移动端自适应flexible.js的使用方法(不用三大框架,仅写一个单html页面使用)推荐
Apr 02 Javascript
JavaScript函数式编程(Functional Programming)组合函数(Composition)用法分析
May 22 Javascript
解决VUEX的mapState/...mapState等取值问题
Jul 24 Javascript
详解javascript脚本何时会被执行
Feb 05 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/10/09 PHP
php下目前为目最全的CURL中文说明
2010/08/01 PHP
Ajax提交表单时验证码自动验证 php后端验证码检测
2016/07/20 PHP
JS解密入门 最终变量劫持
2008/06/25 Javascript
Jquery AJAX POST与GET之间的区别
2013/11/14 Javascript
jquery 使用简明教程
2014/03/05 Javascript
jQuery源码解读之addClass()方法分析
2015/02/20 Javascript
js实现简单选项卡与自动切换效果的方法
2015/04/10 Javascript
javascript中基本类型和引用类型的区别分析
2015/05/12 Javascript
Boostrap入门准备之border box
2016/05/09 Javascript
jquery根据一个值来选中select下的option实例代码
2016/08/29 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
微信小程序chooseImage的用法(从本地相册选择图片或使用相机拍照)
2018/08/22 Javascript
原生JS实现简单的倒计时功能示例
2018/08/30 Javascript
详解vue-cli3开发Chrome插件实践
2019/05/29 Javascript
JavaScript运行机制实例分析
2020/04/11 Javascript
Taro小程序自定义顶部导航栏功能的实现
2020/12/17 Javascript
[08:04]TI4西雅图DOTA2前线报道 海涛探访各路人马
2014/07/09 DOTA
[01:20:38]完美世界DOTA2联赛 GXR vs IO 第一场 11.07
2020/11/09 DOTA
Python从使用线程到使用async/await的深入讲解
2018/09/16 Python
python实现合并两个排序的链表
2019/03/03 Python
python爬虫的一个常见简单js反爬详解
2019/07/09 Python
自适应线性神经网络Adaline的python实现详解
2019/09/30 Python
完美解决Django2.0中models下的ForeignKey()问题
2020/05/19 Python
基于css3 animate制作绚丽的动画效果
2015/11/24 HTML / CSS
HTML5拖拽的简单实例
2016/05/30 HTML / CSS
美国电力供应商店/电气批发商:USESI
2018/10/12 全球购物
英超联赛的首选足球:Mitre足球
2019/05/06 全球购物
公务员上班玩游戏检讨书
2014/09/17 职场文书
学校政风行风评议工作总结
2014/10/21 职场文书
学生会辞职信
2015/03/02 职场文书
房地产工程部经理岗位职责
2015/04/09 职场文书
小学生作文之《压岁钱的烦恼》
2019/09/27 职场文书
MySQL令人咋舌的隐式转换
2021/04/05 MySQL
openstack中的rpc远程调用的方法
2021/07/09 Python
十大冰系宝可梦排名,颜值最高的阿罗拉九尾,第三使用率第一
2022/03/18 日漫