详解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 相关文章推荐
Open and Print a Word Document
Jun 15 Javascript
jQuery ajax在GBK编码下表单提交终极解决方案(非二次编码方法)
Oct 20 Javascript
jquery 利用show和hidden实现级联菜单示例代码
Aug 09 Javascript
Javascript简写条件语句(推荐)
Jun 12 Javascript
微信小程序 教程之列表渲染
Oct 18 Javascript
微信小程序 仿猫眼实现实例代码
Mar 14 Javascript
Ajax高级笔记 JavaScript高级程序设计笔记
Jun 22 Javascript
浅谈node中的exports与module.exports的关系
Aug 01 Javascript
Vue实现active点击切换方法
Mar 16 Javascript
详解ajax的data参数错误导致页面崩溃
Apr 30 Javascript
node基于puppeteer模拟登录抓取页面的实现
May 09 Javascript
vue + el-form 实现的多层循环表单验证
Nov 25 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
PHP的ASP防火墙
2006/10/09 PHP
php支付宝接口用法分析
2015/01/04 PHP
一段实用的php验证码函数
2016/05/19 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
2016/12/09 PHP
自己的js工具_Form 封装
2009/08/21 Javascript
点击文章内容处弹出页面代码
2009/10/01 Javascript
Javascript中Event属性搜集整理
2013/09/17 Javascript
javascript中checkbox使用方法简单实例演示
2015/11/17 Javascript
jQuery Validate表单验证深入学习
2015/12/18 Javascript
JavaScript实现点击单元格改变背景色的方法
2016/02/12 Javascript
JavaScript代码生成PDF文件的方法
2016/02/26 Javascript
js简单获取表单中单选按钮值的方法
2016/08/23 Javascript
jquery实现自定义图片裁剪功能【推荐】
2017/03/08 Javascript
详解webpack+express多页站点开发
2017/12/22 Javascript
Vue动态控制input的disabled属性的方法
2018/06/26 Javascript
在vue项目中引用Iview的方法
2018/09/14 Javascript
详解Vue之计算属性
2020/06/20 Javascript
ElementUI 修改默认样式的几种办法(小结)
2020/07/29 Javascript
python解析json实例方法
2013/11/19 Python
Python中用PIL库批量给图片加上序号的教程
2015/05/06 Python
解决Scrapy安装错误:Microsoft Visual C++ 14.0 is required...
2017/10/01 Python
python实现学生信息管理系统
2020/04/05 Python
Python将图片转换为字符画的方法
2020/06/16 Python
python 划分数据集为训练集和测试集的方法
2018/12/11 Python
Python动态赋值的陷阱知识点总结
2019/03/17 Python
一行Python代码制作动态二维码的实现
2019/09/09 Python
详解Python3迁移接口变化采坑记
2019/10/11 Python
tensorflow生成多个tfrecord文件实例
2020/02/17 Python
keras自动编码器实现系列之卷积自动编码器操作
2020/07/03 Python
如何查看python关键字
2021/01/17 Python
美国球迷装备的第一来源:FOCO
2020/07/03 全球购物
前台文员岗位职责
2013/12/28 职场文书
2015年科协工作总结
2015/05/19 职场文书
安全第一课观后感
2015/06/18 职场文书
初中政治教学反思
2016/02/23 职场文书
mysql如何配置白名单访问
2021/06/30 MySQL