详解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 相关文章推荐
QUnit jQuery的TDD框架
Nov 04 Javascript
jquery文本框中的事件应用以输入邮箱为例
May 06 Javascript
jquery实现图片按比例缩放示例
Jul 01 Javascript
jQuery Ajax()方法使用指南
Nov 19 Javascript
JS组件Bootstrap Table使用实例分享
May 30 Javascript
JS实现拖动滚动条评分的效果代码分享
Sep 29 Javascript
jQuery实现鼠标滑过预览图片大图效果的方法
Apr 26 jQuery
Angular.js实现动态加载组件详解
May 28 Javascript
Vue2.0基于vue-cli+webpack Vuex的用法(实例讲解)
Sep 15 Javascript
JS使用tofixed与round处理数据四舍五入的区别
Oct 25 Javascript
vue-router源码之history类的浅析
May 21 Javascript
用JS实现一个简单的打砖块游戏
Dec 11 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
SONY SRF-M100的电路分析
2021/03/02 无线电
laravel框架实现为 Blade 模板引擎添加新文件扩展名操作示例
2020/01/25 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
2020/05/02 PHP
JavaScript中对象属性的添加和删除示例
2014/05/12 Javascript
node.js中的fs.writeFile方法使用说明
2014/12/14 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
2015/09/24 Javascript
javascript的 {} 语句块详解
2016/02/27 Javascript
深入浅出ES6之let和const命令
2016/08/25 Javascript
javascript动画之模拟拖拽效果篇
2016/09/26 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
2017/01/18 Javascript
分享一道关于闭包、bind和this的面试题
2017/02/20 Javascript
js实现简易垂直滚动条
2017/02/22 Javascript
Node解决简单重复问题系列之Excel内容的获取
2018/01/02 Javascript
vue-router之nuxt动态路由设置的两种方法小结
2018/09/26 Javascript
javascript代码实现简易计算器
2021/01/25 Javascript
简述Python中的面向对象编程的概念
2015/04/27 Python
在Python下尝试多线程编程
2015/04/28 Python
Python函数可变参数定义及其参数传递方式实例详解
2015/05/25 Python
python访问抓取网页常用命令总结
2017/04/11 Python
Python使用time模块实现指定时间触发器示例
2017/05/18 Python
PyQt5每天必学之工具提示功能
2018/04/19 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
2018/11/06 Python
python pyinstaller 加载ui路径方法
2019/06/10 Python
python实现基于朴素贝叶斯的垃圾分类算法
2019/07/09 Python
Python-split()函数实例用法讲解
2020/12/18 Python
python中的列表和元组区别分析
2020/12/30 Python
python matlab库简单用法讲解
2020/12/31 Python
用python-webdriver实现自动填表的示例代码
2021/01/13 Python
java关于string最常出现的面试题整理
2021/01/18 Python
预订奥兰多和佛罗里达州公园门票:FloridaTix
2018/01/03 全球购物
DeinDesign德国:设计自己的手机壳
2019/12/14 全球购物
神路信息Java面试题目
2013/03/31 面试题
公司庆典邀请函范文
2014/01/13 职场文书
土木工程毕业答辩开场白
2015/05/29 职场文书
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
2021/06/21 Oracle
WINDOWS下安装mysql 8.x 的方法图文教程
2022/04/19 MySQL