详解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小数计算出现近似值的解决办法
Feb 06 Javascript
ExtJs 表单提交登陆实现代码
Aug 19 Javascript
Bootstrap框架安装使用详解
Jan 21 Javascript
js获取隐藏元素的宽高
Feb 24 Javascript
jQuery自动或手动图片切换效果
Oct 11 jQuery
js中如何完美的解析数据
Mar 18 Javascript
jQuery基于随机数解决中午吃什么去哪吃问题示例
Dec 29 jQuery
layui实现三级联动效果
Jul 26 Javascript
Element-UI中关于table表格的那些骚操作(小结)
Aug 15 Javascript
vue-resource:jsonp请求百度搜索的接口示例
Nov 09 Javascript
JavaScript实现文件下载并重命名代码实例
Dec 12 Javascript
vue el-upload上传文件的示例代码
Dec 21 Vue.js
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
浅谈电磁辐射对健康的影响
2021/03/01 无线电
PHP+APACHE实现用户论证的方法
2006/10/09 PHP
php利用反射实现插件机制的方法
2015/03/14 PHP
php抓取并保存网站图片的实现代码
2015/10/28 PHP
laravel5.5添加echarts实现画图功能的方法
2019/10/09 PHP
laravel 数据验证规则详解
2019/10/23 PHP
JavaScript 类的定义和引用 JavaScript高级培训 自定义对象
2010/04/27 Javascript
jquery png 透明解决方案(推荐)
2010/08/21 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
js window.print实现打印特定控件或内容
2013/09/16 Javascript
JavaScript中判断整字类型最简洁的实现方法
2014/11/08 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
2015/09/06 Javascript
nodejs微信公众号支付开发
2016/09/19 NodeJs
微信小程序 icon组件详细及实例代码
2016/10/25 Javascript
Vue精简版风格指南(推荐)
2018/01/30 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
2018/04/12 Javascript
js replace 全局替换的操作方法
2018/06/12 Javascript
浅谈Angular6的服务和依赖注入
2018/06/27 Javascript
Jquery cookie插件实现原理代码解析
2020/08/04 jQuery
详解三种方式在React中解决绑定this的作用域问题并传参
2020/08/18 Javascript
python 连接sqlite及简单操作
2017/06/30 Python
python实现图片批量压缩程序
2018/07/23 Python
Python使用pandas和xlsxwriter读写xlsx文件的方法示例
2019/04/09 Python
使用Python实现跳帧截取视频帧
2019/05/31 Python
python tkinter canvas 显示图片的示例
2019/06/13 Python
flask框架渲染Jinja模板与传入模板变量操作详解
2020/01/25 Python
Python sublime安装及配置过程详解
2020/06/29 Python
Python判断变量是否是None写法代码实例
2020/10/09 Python
如何快速一次性卸载所有python包(第三方库)呢
2020/10/20 Python
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
表达自我的市场:Society6
2018/08/01 全球购物
为什么UNION ALL比UNION快
2016/03/17 面试题
作文评语集锦大全
2014/04/23 职场文书
MySQL Shell的介绍以及安装
2021/04/24 MySQL
Python常遇到的错误和异常
2021/11/02 Python
MySQL图形化管理工具Navicat安装步骤
2021/12/04 MySQL